donmageは非常に正しいです-LISTEN
およびNOTIFY
あなたが望むものです。ポーリングループは引き続き必要ですが、非常に軽量であり、検出可能なサーバー負荷が発生することはありません。
psycopg2
が必要な場合 いつでもコールバックをトリガーする プログラムでは、スレッドを生成し、そのスレッドにポーリングループを実行させることで、これを行うことができます。 psycopg2がスレッドセーフな接続アクセスを強制するかどうかを確認します。そうでない場合は、接続がアイドル状態のときにのみポーリングループが実行され、他のクエリがポーリングサイクルを中断しないように、独自のロックを行う必要があります。または、イベントのポーリングに2番目の接続を使用することもできます。
いずれにせよ、通知イベントをポーリングしているバックグラウンドスレッドがそれを受信すると、メインプログラムによって提供されるPythonコールバック関数を呼び出すことができます。これにより、プログラムの残りの部分で共有されるデータ構造/変数が変更される可能性があります。これを行うと、すぐに維持するのが悪夢になる可能性があることに注意してください。
そのアプローチを取る場合は、multithreading
を使用することを強くお勧めします /multiprocessing
モジュール。スレッド間でデータを交換する簡単な方法を提供し、リスニングスレッドによる変更をシンプルで適切に制御された場所に制限することで、作業が大幅に楽になります。
プロセスの代わりにスレッドを使用する場合、cPython(つまり「通常のPython」)では、一度に1つのスレッドしか実行できないため、真のコールバック割り込みを設定できないことを理解することが重要です。これについてさらに理解するには、「グローバルインタプリタロック」(GIL)について読んでください。この制限(およびシェアードナッシングのデフォルトの同時実行性のより簡単で安全な性質)のために、私はマルチスレッドよりもマルチプロセッシングを好むことがよくあります。