3

簡単な質問:N作業プロセスと、balancer現時点で何もしないワーカーを見つけてそこに渡すプロセスを持つことは可能UnitOfWorkですか?

長い質問: このようなクラスを想像してみてください。魔女は特定のタスクのためにサブクラス化されます:

class UnitOfWork:
  def __init__(self, **some_starting_parameters):
    pass
  def init(self):
    # open connections, etc.
  def run(self):
    # do the job

バランサーとワーカー プロセスを開始します。

balancer = LoadBalancer()
workers  = balancer.spawn_workers(10)

作業をデプロイします (バランサーは怠惰なワーカーを見つけてそれにタスクを渡す必要があります。または、すべてのワーカーがビジー状態の場合は、UOW をキューに追加し、ワーカーが解放されるまで待ちます):

balancer.work(UnitOfWork(some=parameters))
# internally, find free worker, pass UOW, ouw.init() + ouw.run()

これは可能ですか(またはクレイジーですか)?

PS私はmultiprocessing Processクラスとプロセスプールに精通していますが、

  • すべてProcessのインスタンスがプロセスを開始します (yep :) ) - 固定数のワーカーが必要です
  • Process汎用的に動作するインスタンスが欲しい
4

2 に答える 2

6

multiprocessing.Pool()あなたの問題を正確に解決すると信じているので、ご覧になることをお勧めします。N 個の「ワーカー プロセス」を実行し、各ワーカーがタスクを完了すると、別のタスクが提供されます。そして、「毒薬」は必要ありません。それはとても簡単です。

私は常に.map()プールでメソッドを使用してきました。

Python multiprocessing.Pool: apply、apply_async、または map をいつ使用するか?

編集:これは私が別の質問に書いた回答であり、回答で使用multiprocessing.Pool()しました。

並列ファイル マッチング、Python

于 2012-07-16T21:11:26.947 に答える
3

バランサーにスマートは必要ありません。キューだけであなたが望むことをします。各作業単位をキューに入れ、ワーカーをループさせて、キューから1つの作業単位を取得し、各反復で処理します。UnitOfWorkのインスタンスをキューに渡すのに問題はないと思います。

実行する作業の量が決まっている場合は、作業者にシャットダウンするように指示する「これ以上実行する必要のない」作業単位(「ポイズンピル」)を作成して、すべての通常の作業を実行することができます。キュー、あなたが労働者を持っているのと同じくらい多くの毒薬をキューに入れてください。

于 2012-07-16T19:36:37.723 に答える