非同期通知

Postgres は, LISTENNOTIFY コマンドによる非同期通知機能をサポートしています. バックエンドは LISTEN コマンドを受け取ると, 特定のセマフォへ関心を持ったことを登録します. 名前のついた特定のセマフォを見ているすべてのバックエンドは, 他のバックエンドによって同じ名前の NOTIFY コマンドが実行された時点で非同期的に通知されます. ただし通知の発行側から受信側へ渡される付加的な情報はありません. したがって,典型的にはリレーションを通じ, 両者の間で交換すべき実際のデータを転送することになります.

Note: 以前のドキュメントは, 非同期通知に使う名前とリレーション(クラス)を関連するものとしていました. しかし現実には,実装がこの二つの概念を直接結び付けている部分は何ひとつありません. そして以前定義していたように, 名前付きセマフォが対応するリレーションを持つ必要性も実際にはありません.

接続しているバックエンドが非同期通知を受けるたびに, libpq++ アプリケーションもその通知を受けます. しかしバックエンドからフロントエンドへの通信は非同期的なものではありません. libpq++ アプリケーションは保留中の通知情報がないかどうか確認するために, バックエンドへのポーリングをしなければならないのです. フロントエンドは PgDatabase::Notifies を問い合わせ実行の後に呼び出し, その時点でバックエンドから通知データが届いていないか確認することができます. PgDatabase::Notifies はバックエンドから届いた通知の未処理分リストから,ひとつ通知を返します. バックエンドからの通知が何も保留されていなければ,この関数は NULL を返します. PgDatabase::Notifies の動作はスタックのポップのようなものです. いったん PgDatabase::Notifies が通知を返すとその通知はもはや処理が済んだものとみなされ, 通知リストから取り除かれます.

なお,二番目のサンプルプログラムが非同期通知を使用した例です.