2

Python のマルチプロセッシング モジュールを使用して、複数のマシンで分散タスクを実行しようとしています。このブログ投稿を参考にしています。

ただし、この投稿のタスクはジョブ キューを使用し、結果を結果キューに入れます。どちらも JobQueueManager (SyncManager のサブクラス) によって管理されます。このマネージャにはサーバーがあり、 を呼び出したときに結果キューがいっぱいになるまで起動し、継続的に実行されますmanager.shutdown()

私の問題は、私のタスクが結果キューを必要としないことです。そのため、サーバーをいつ停止するかを知る方法を見つけようとしています。でサーバーを継続的に実行してserve_foreverから手動で停止するか、例と同じようにいっぱいになるダミ​​ー キューを作成し、元のジョブ数と同じ数になるとサーバーを停止することができます。

手動で停止したくないのですが、2 番目の解決策はややハックなようです。(サーバーなしで)一般的な方法の1つは、各プロセスで呼び出すjoin()ことですが、マネージャーが各ジョブをキューから削除したプロセスを見つける方法があるかどうかはわかりません。

私のフォールバック プランはダミー キュー メソッドの変形ですが、各プロセスの最後のステップとしてインクリメントされる共有カウンター変数を使用しますが、マルチプロセッシング ライブラリのメソッドを使用する提案があるかどうか、またはこれは信頼できません。

ありがとう

編集:結果キューを使用しない理由は、処理の結果をRedisデータベースに保存しているためだとは言いませんでした。

4

2 に答える 2

1

与えられた例では:

outdict = shared_result_q.get()

結果キューは、結果を非同期的に待機するために使用されます。これが主要な通信方法です。これがないと、タスク終了イベントを確認する別のシグナル メカニズムが必要になります。Noneキューに入れるだけです。

于 2012-10-20T18:58:01.577 に答える
0

私の更新が示すように、私はすでに redis データベースを使用してタスクの結果を保存しているため、異なるマシン間での dict の管理について心配する必要はありません。

私が最終的に使用したソリューションでも、Redis db を使用しています。各プロセスが完了するたびに、プロセスの情報を含む文字列をリストにプッシュします ( r_server.lpush(...)in redis-py )。サーバー側では、結果キューにブロッキング メソッドを使用する代わりに、同じように機能getする Redis のブロッキング ポップを使用します。rs.blpop()

これは、ダミー キューを作成して を使用するというブログ投稿やその他の提案とほぼ同じですget()が、redis を使用するだけなので、メソッド引数を追加したり、マネージャーに追加メソッドを登録したりするオーバーヘッドがありません。

于 2012-10-24T01:26:29.177 に答える