donmage ma rację - LISTEN
i NOTIFY
są tym, czego chcesz. Nadal będziesz potrzebować pętli odpytywania, ale jest ona bardzo lekka i nie spowoduje wykrywalnego obciążenia serwera.
Jeśli chcesz psycopg2
uruchamiać wywołania zwrotne w w dowolnym momencie w swoim programie możesz to zrobić, tworząc wątek i wykonując pętlę odpytywania przez ten wątek. Sprawdź, czy psycopg2 wymusza bezpieczny wątkowy dostęp do połączenia; jeśli nie, musisz wykonać własne blokowanie, aby pętla odpytywania działała tylko wtedy, gdy połączenie jest bezczynne, a żadne inne zapytania nie przerywają cyklu odpytywania. Możesz też użyć drugiego połączenia do odpytywania zdarzeń.
Tak czy inaczej, gdy wątek w tle, który odpytuje zdarzenia powiadamiające, otrzyma je, może wywołać funkcję zwrotną Pythona dostarczoną przez program główny, która może modyfikować struktury danych / zmienne współdzielone przez resztę programu. Uważaj, jeśli to zrobisz, ponieważ utrzymanie może szybko stać się koszmarem.
Jeśli przyjmiesz takie podejście, zdecydowanie sugeruję użycie multithreading
/ multiprocessing
moduły. Znacznie ułatwią Ci życie, zapewniając proste sposoby wymiany danych między wątkami i ograniczając modyfikacje dokonywane przez wątek nasłuchujący do prostych i dobrze kontrolowanych lokalizacji.
Jeśli używasz wątków zamiast procesów, ważne jest, aby zrozumieć, że w cPythonie (tj. „normalnym Pythonie”) nie możesz mieć prawdziwego przerwania wywołania zwrotnego, ponieważ tylko jeden wątek może być wykonywany naraz w cPythonie. Przeczytaj o „globalnej blokadzie interpretera” (GIL), aby dowiedzieć się więcej na ten temat. Ze względu na to ograniczenie (i łatwiejszy, bezpieczniejszy charakter domyślnej współbieżności typu „nothing”) często wolę wieloprocesorowość niż wielowątkowość.