donmage hat recht - LISTEN
und NOTIFY
sind was du willst. Sie benötigen immer noch eine Polling-Schleife, aber sie ist sehr leicht und verursacht keine erkennbare Serverlast.
Wenn Sie psycopg2
wollen um Rückrufe jederzeit auszulösen In Ihrem Programm können Sie dies tun, indem Sie einen Thread erzeugen und diesen Thread die Abfrageschleife ausführen lassen. Überprüfen Sie, ob psycopg2 einen Thread-sicheren Verbindungszugriff erzwingt; Wenn dies nicht der Fall ist, müssen Sie Ihre eigene Sperre vornehmen, damit Ihre Abfrageschleife nur ausgeführt wird, wenn die Verbindung im Leerlauf ist, und keine anderen Abfragen einen Abfragezyklus unterbrechen. Oder Sie verwenden einfach eine zweite Verbindung für Ihre Ereignisabfrage.
So oder so, wenn der Hintergrundthread, der Benachrichtigungsereignisse abfragt, eines erhält, kann er eine von Ihrem Hauptprogramm bereitgestellte Python-Callback-Funktion aufrufen, die möglicherweise Datenstrukturen / Variablen ändert, die vom Rest des Programms gemeinsam genutzt werden. Passen Sie auf, wenn Sie dies tun, dass die Wartung schnell zu einem Alptraum werden kann.
Wenn Sie diesen Ansatz wählen, empfehle ich dringend die Verwendung von multithreading
/ multiprocessing
Module. Sie werden Ihnen das Leben erheblich erleichtern, indem sie einfache Möglichkeiten zum Austausch von Daten zwischen Threads bieten und Änderungen, die vom lauschenden Thread vorgenommen werden, auf einfache und gut kontrollierte Orte beschränken.
Wenn Sie Threads anstelle von Prozessen verwenden, ist es wichtig zu verstehen, dass Sie in cPython (dh "normalem Python") keinen echten Callback-Interrupt haben können, da in cPython nur ein Thread gleichzeitig ausgeführt werden kann. Lesen Sie mehr über die "globale Interpreter-Sperre" (GIL), um mehr darüber zu erfahren. Aufgrund dieser Einschränkung (und der einfacheren, sichereren Art von Shared-Nothing-by-Default-Parallelität) ziehe ich oft Multiprocessing gegenüber Multithreading vor.