sql >> データベース >  >> RDS >> PostgreSQL

テーブルの変更に関する自動通知を受け取る方法は?

    donmageは非常に正しいです-LISTEN およびNOTIFY あなたが望むものです。ポーリングループは引き続き必要ですが、非常に軽量であり、検出可能なサーバー負荷が発生することはありません。

    psycopg2が必要な場合 いつでもコールバックをトリガーする プログラムでは、スレッドを生成し、そのスレッドにポーリングループを実行させることで、これを行うことができます。 psycopg2がスレッドセーフな接続アクセスを強制するかどうかを確認します。そうでない場合は、接続がアイドル状態のときにのみポーリングループが実行され、他のクエリがポーリングサイクルを中断しないように、独自のロックを行う必要があります。または、イベントのポーリングに2番目の接続を使用することもできます。

    いずれにせよ、通知イベントをポーリングしているバックグラウンドスレッドがそれを受信すると、メインプログラムによって提供されるPythonコールバック関数を呼び出すことができます。これにより、プログラムの残りの部分で共有されるデータ構造/変数が変更される可能性があります。これを行うと、すぐに維持するのが悪夢になる可能性があることに注意してください。

    そのアプローチを取る場合は、multithreadingを使用することを強くお勧めします /multiprocessing モジュール。スレッド間でデータを交換する簡単な方法を提供し、リスニングスレッドによる変更をシンプルで適切に制御された場所に制限することで、作業が大幅に楽になります。

    プロセスの代わりにスレッドを使用する場合、cPython(つまり「通常のPython」)では、一度に1つのスレッドしか実行できないため、真のコールバック割り込みを設定できないことを理解することが重要です。これについてさらに理解するには、「グローバルインタプリタロック」(GIL)について読んでください。この制限(およびシェアードナッシングのデフォルトの同時実行性のより簡単で安全な性質)のために、私はマルチスレッドよりもマルチプロセッシングを好むことがよくあります。



    1. Postgresでクロス集計を使用できません

    2. 現在の日付から月を引くsql

    3. HibernateOracleテーブルスペースアノテーション

    4. サブクエリ結果でMAX()を使用するにはどうすればよいですか?