donmage ha ragione - LISTEN
e NOTIFY
sono quello che vuoi. Avrai comunque bisogno di un ciclo di polling, ma è molto leggero e non causerà un carico rilevabile del server.
Se vuoi psycopg2
per attivare le richiamate in qualsiasi momento nel tuo programma, puoi farlo generando un thread e facendo in modo che quel thread esegua il ciclo di polling. Verificare se psycopg2 impone l'accesso alla connessione thread-safe; in caso contrario, dovrai eseguire il tuo blocco in modo che il tuo ciclo di polling venga eseguito solo quando la connessione è inattiva e nessun'altra query interrompa un ciclo di polling. Oppure puoi semplicemente utilizzare una seconda connessione per il polling del tuo evento.
Ad ogni modo, quando il thread in background che sta effettuando il polling per gli eventi di notifica ne riceve uno, può invocare una funzione di callback Python fornita dal tuo programma principale, che potrebbe modificare le strutture dati/variabili condivise dal resto del programma. Fai attenzione, se lo fai, può diventare rapidamente un incubo da mantenere.
Se segui questo approccio, ti consiglio vivamente di utilizzare il multithreading
/ multiprocessing
moduli. Ti semplificheranno enormemente la vita, fornendo modi semplici per scambiare dati tra thread e limitando le modifiche apportate dal thread in ascolto a posizioni semplici e ben controllate.
Se si utilizzano i thread invece dei processi, è importante capire che in cPython (ovvero "python normale") non è possibile avere un vero interrupt di callback, perché in cPython potrebbe essere in esecuzione solo un thread alla volta. Leggi il "blocco dell'interprete globale" (GIL) per saperne di più. A causa di questa limitazione (e della natura più semplice e sicura della simultaneità predefinita del nulla condiviso) spesso preferisco il multiprocessing al multithreading.