3

デーモンとして実行されている Python スクリプトがあります。起動時に 5 つのプロセスが生成され、それぞれが Postgres データベースに接続します。現在、DB 接続の数 (最終的には非常に大きくなります) を減らすために、単一の接続を複数のプロセスで共有する方法を見つけようとしています。そして、この目的のために私はmultiprocessing.sharedctypes.ValueAPIを見ています。psycopg2.connectionただし、この API を使用してプロセス間でオブジェクトを渡す方法がわかりません。誰がそれがどのように行われるのか教えてもらえますか?

この問題を解決するために、私は他のアイデアにもオープンです。

接続をコンストラクタの一部として 5 つのプロセスに渡すことを考慮しなかった理由は、相互排除の処理です。このアプローチに従った場合、複数のプロセスが接続にアクセスするのを防ぐ方法がわかりません。これが正しいことかどうか誰かに教えてもらえますか?

4

1 に答える 1

11

そのようなプロセス間で DB 接続を正常に共有することはできません。スレッド間で接続共有することはできますが、接続が一度に 1 つのスレッドによってのみ使用されることを確認した場合に限ります。クライアントのアドレス空間に保存されている接続のクライアント側の状態があるため、プロセス間では機能しません。

多数の同時ワーカーが必要であるが、常に DB を使用していない場合は、すべてのデータベース アクセスを処理し、他のワーカー プロセスとデータを交換するデータベース ワーカープロセスのグループを用意する必要があります。各データベース ワーカー プロセスには DB 接続があります。他のプロセスは、データベース ワーカーを介してのみデータベースと通信します。

Python のマルチプロセッシング キュー、fifos などは、そのための適切なメッセージング機能を提供します。

于 2014-09-27T07:11:33.543 に答える