を私はあなたがPool.mapアプローチはあなたに多くの意味を成していないと述べた知っています。マップは、仕事のソースを与える簡単な方法であり、各項目に適用する呼び出し可能です。マップのfunc
は、指定されたargに対して実際の作業を行うためのエントリポイントです。
それがあなたのために右のように見えるしていない場合、私は生産者 - 消費者パターンを使用する方法についてこちらにかなり詳細な回答を持っています。基本的にhttps://stackoverflow.com/a/11196615/496445
、あなたがキューを作成し、労働者のN番号を開始します。次に、メインスレッドからキューをフィードするか、キューにフィードするProducerプロセスを作成します。ワーカーは待ち行列から作業を続けるだけで、開始したプロセスの数より多くの並行作業が発生することはありません。
また、生産者が消費する速度とリソースにも制約を加える必要がある場合は、すでに優れた作業が多すぎるときにプロデューサをブロックするように、キューに制限を付けることもできます。
呼び出される作業関数は、任意のことを行うことができます。これは、いくつかのシステムコマンドのラッパーでも、Pythonのlibをインポートしてメインルーチンを実行することもできます。限られたリソースの下で任意の実行可能ファイルを実行するようにconfigsを設定できるようにする特定のプロセス管理システムがありますが、これは基本的なPythonのアプローチです。私のことother answerから
スニペット:
基本プール:マルチプロセッシングの使用に関する多くの答えがありますが、プロセスマネージャとプロデューサー
from multiprocessing import Process, Manager
import time
import itertools
def do_work(in_queue, out_list):
while True:
item = in_queue.get()
# exit signal
if item == None:
return
# fake work
time.sleep(.5)
result = item
out_list.append(result)
if __name__ == "__main__":
num_workers = 4
manager = Manager()
results = manager.list()
work = manager.Queue(num_workers)
# start for workers
pool = []
for i in xrange(num_workers):
p = Process(target=do_work, args=(work, results))
p.start()
pool.append(p)
# produce data
# this could also be started in a producer process
# instead of blocking
iters = itertools.chain(get_work_args(), (None,)*num_workers)
for item in iters:
work.put(item)
for p in pool:
p.join()
print results
出典
2012-08-17 01:02:10
jdi
[Python process pools](http://docs.python.org/library/multiprocessing.html#module-multiprocessing.pool)を試しましたか? – C2H5OH
これを行う最も簡単な方法は、 'multiprocessing.pool'を作成し、ワーカー(program.py)スレッドを生成し、インスタンスをインスタンスとして再割り当てして終了する「コントローラ」プログラムを作成することです。 – jozzas
ありがとう、私はこれを試してみます。何らかの理由で私の最初の試みで、私は結論に達しました。マルチプロセッシングは私が望んでいたものではありませんでしたが、今は正しいようです。だから、この場合、ワーカースレッドはprogram.pyを(スレッドとして?subprocess.Popenで)生成するだけでしょうか?私が従うことができる大まかな例やテンプレート実装を投稿してください。 – steadfast