donmage está certo -
LISTEN
e NOTIFY
são o que você quer. Você ainda precisará de um loop de pesquisa, mas é muito leve e não causará carga detectável no servidor. Se você quiser
psycopg2
para acionar retornos de chamada a qualquer momento em seu programa, você pode fazer isso gerando um encadeamento e fazendo com que esse encadeamento execute o loop de pesquisa. Verifique se o psycopg2 impõe o acesso à conexão thread-safe; se isso não acontecer, você precisará fazer seu próprio bloqueio para que seu loop de pesquisa seja executado apenas quando a conexão estiver ociosa e nenhuma outra consulta interrompa um ciclo de pesquisa. Ou você pode simplesmente usar uma segunda conexão para sua pesquisa de eventos. De qualquer forma, quando o thread em segundo plano que está pesquisando eventos de notificação recebe um, ele pode invocar uma função de retorno de chamada do Python fornecida pelo seu programa principal, que pode modificar estruturas/variáveis de dados compartilhadas pelo resto do programa. Cuidado, se você fizer isso, pode rapidamente se tornar um pesadelo para manter.
Se você adotar essa abordagem, sugiro fortemente usar o
multithreading
/ multiprocessing
módulos. Eles tornarão sua vida muito mais fácil, fornecendo maneiras simples de trocar dados entre threads e limitando as modificações feitas pelo thread de escuta a locais simples e bem controlados. Se estiver usando threads em vez de processos, é importante entender que no cPython (ou seja, "Python normal") você não pode ter uma interrupção de retorno de chamada verdadeira, porque apenas um thread pode estar sendo executado no cPython ao mesmo tempo. Leia sobre o "bloqueio global do intérprete" (GIL) para entender mais sobre isso. Por causa dessa limitação (e da natureza mais fácil e segura do shared-nothing por padrão de simultaneidade), geralmente prefiro multiprocessamento a multithreading.