2011-01-13 5 views
2

最低限の数の子プロセスがいつでも有効であるようにしたい。現在、以下のように起動します: - 私はこのケースでは新しいワーカーを起動したいPythonでのマルチプロセッシング - 子プロセスの最小数がアクティブであることを保証する

pool = Pool(processes=WORKERS) 
pool.map(worker.run, range(WORKERS)) # pass process a number as its ID 

労働者がエラーのためreturnまたはクラッシュして焼くだろう特定のケースがあります。これはすべて可能ですか?

おかげで、

+0

面白いことに、マルチプロセッシングソースを見ると、Poolはこれを自動的に行い、exitがあればプールがRUN状態になると必要に応じて新しいワーカーを追加します。 – TryPyPy

答えて

2

ここでは、単純な(ダム?)ソリューションです:定期的に、すべての労働者をチェック戻ってきたものをポップし、作業者リスト(Doug Hellmanから借りベースコード)に新しいものを追加します。

import multiprocessing, random, time 

def worker(num): 
    """thread worker function""" 
    time.sleep(random.randint(1,10)) 
    print 'Worker:', num 
    return 

if __name__ == '__main__': 
    jobs = [] 
    for i in range(5): 
     p = multiprocessing.Process(target=worker, args=(i,)) 
     jobs.append(p) 
     p.start() 

    while True: 
     time.sleep(2) 
     for n, p in enumerate(jobs): 
      if not p.is_alive(): 
       jobs.pop(n) 
       i += 1 
       p = multiprocessing.Process(target=worker, args=(i,)) 
       jobs.append(p) 
       p.start() 
は、
+0

ありがとうございます - 私は今このために病気になると思います。内部の再処理doesntは私のために働くように思われます。 – malangi

+0

データベースクラスタのカスタムプロセスプールを実装する必要があるときも同じことをしました。その効果は十分ですが、stdlibを使うのが好きです。なぜなら、私はすべての内部のもののために踏み込んでいるわけではないからです。 – bitcycle

関連する問題