PostgreSQL
 sql >> Datenbank >  >> RDS >> PostgreSQL

Warum verwendet „libpq“ Abfragen statt Benachrichtigungen für den Datenabruf?

Im Ausführungsmodell eines Monothread-Programms kann der Ausführungsfluss nicht durch Daten unterbrochen werden, die von einer asynchronen Abfrage oder allgemeiner von einem Netzwerk-Socket zurückkommen. Nur Signale (SIGTERM und Freunde) können den Fluss unterbrechen, aber Signale können nicht mit eingehenden Daten verknüpft werden.

Aus diesem Grund ist ein Rückruf zur Benachrichtigung über eingehende Daten nicht möglich. Der Code in libpq, der zum Senden des Rückrufs erforderlich wäre, würde niemals ausgeführt, wenn Ihr Code ihn nicht aufruft. Und wenn Sie es anrufen müssen, macht das den ganzen Sinn eines Rückrufs zunichte.

Es gibt Bibliotheken wie Qt die Rückrufe bereitstellen, aber von Grund auf mit einer Hauptschleife ausgestattet sind, die als Ereignisprozessor fungiert. Der Benutzercode ist in Callbacks organisiert und eine ereignisbasierte Verarbeitung eingehender Daten ist möglich. Aber in diesem Fall übernimmt die Bibliothek den Ausführungsfluss, was bedeutet, dass ihre Hauptschleife die Datenquellen abfragt. Das verschiebt nur die Verantwortung auf ein anderes Stück Code außerhalb von libpq.