2

Python で 2 つのプロセス間でキュー (リソース) を共有するためのベスト プラクティスを知りたいです。各プロセスが行っていることは次のとおりです。

Process_1:ストリーミング API からデータ (json 形式) を継続的に取得します

Process_2:データを (一度に 1 つずつ) データベースにコミットするデーモン (Sander Marechal のコードに類似) です。

したがって、Process_1 (またはプロデューサー) はこの共有リソースにデータのユニットを配置し、Process_2 (またはコンシューマー) はこの共有リソースに新しいデータのユニットをポーリングし、DB に格納します (存在する場合)。

私の頭に浮かんだいくつかのオプションがあります:

  • ピクルスの使用 (欠点: ピクルス化とデピクリングの余分なオーバーヘッド)
  • stdoutProcess_1 から Process_2 へのデータの受け渡しstdin(欠点: なし、ただしデーモンでこれを実装する方法がわからない)
  • poolライブラリ内のオブジェクトを使用するmultiprocessing(欠点: 1 つのプロセスがデーモンであるため、これをコーディングする方法がわからない)

この点に関して、いくつかのコードを使用して、最適なソリューションを実践したいと思います:)。ありがとう。

4

1 に答える 1

6

multiprocessing.poolこの場合、あなたが望むものではありません - 複数の作業単位を「バックグラウンドで」(同時に)実行するのに役立ちますが、共有リソースの管理にはあまり役立ちません。あなたはコミュニケーションの形式がうまくいっているように見え、それらは一方向にしかコミュニケーションをとらないので、あなたが望むのはmultiprocessing.Queue-ドキュメント使用方法の良い例があります - Process_1 が必要に応じてキューにデータを入れ、Process_2 が無限ループで q.get() を呼び出す必要があります。これにより、何もすることがないときにコンシューマがブロックされ、提案されているようにビジー待機するのではなく(プロセッササイクルが無駄になる可能性があります)。これが残す問題は、デーモンを閉じることです。おそらく最良の方法は、プロデューサーがセンチネル値をキューの最後に置いて、コンシューマーがすべての要求を確実に処理するようにすることです。他の代替手段には、子が終了したときにプロセスを強制的に強制終了しようとするようなものがありますが、これはエラーが発生しやすいです。

これは、プロデューサーがコンシューマーを生成する (またはその逆) ことを前提としていることに注意してください。私の知る限り、クロスプラットフォームの高レベル IPC モジュール。これを処理する最も移植性の高い (そして一般的に最も簡単な) 方法は、ファイルシステムをキューとして使用することです。プロデューサーが要求ごとにテキスト ファイルを書き込むスプール フォルダーをどこかに用意します。その後、消費者はこれらを自由に処理できます - ただし、これには問題がないわけではありません。消費者が半分書かれた命令ファイルを開こうとしないこと、プロデューサーが踏んでいないことを確認する必要があります。互いのつま先、およびプロデューサーとコンシューマーが要求の順序について同意すること。

于 2011-06-02T08:03:01.133 に答える