私はいくつかのプロセスを一緒にやっています。各プロセスはいくつかの結果を返します。それらのプロセスからそれらの結果をどのように収集しますか。
task_1 = Process(target=do_this_task,args=(para_1,para_2))
task_2 = Process(target=do_this_task,args=(para_1,para_2))
do_this_task
いくつかの結果を返します。これらの結果を収集し、変数に保存したいと思います。
私はいくつかのプロセスを一緒にやっています。各プロセスはいくつかの結果を返します。それらのプロセスからそれらの結果をどのように収集しますか。
task_1 = Process(target=do_this_task,args=(para_1,para_2))
task_2 = Process(target=do_this_task,args=(para_1,para_2))
do_this_task
いくつかの結果を返します。これらの結果を収集し、変数に保存したいと思います。
したがって、今のところ、pythonmultiprocessing
モジュールの Pool を使用することをお勧めします。あなたが何をしているのか、そしてなぜ私が想定しているものをmultiprocessing.Process
直接使用したいのかを詳しく説明していただけますか?
それでも直接使用したい場合multiprocessing.Process
は、キューを使用して戻り値を取得する必要があります。
ドキュメントに記載されている例:
"
from multiprocessing import Process, Queue
def f(q):
q.put([42, None, 'hello'])
if __name__ == '__main__':
q = Queue()
p = Process(target=f, args=(q,))
p.start()
print q.get() # prints "[42, None, 'hello']"
p.join()
したがって、プロセスは通常、バックグラウンドで実行されて一般的に何かを実行するものです。プロセスでマルチプロセッシングを行う場合、プロセスにはスレッドのような共有メモリがないため、データを「スロー」する必要があります-そのため、キューを使用します-それはあなたのためにそれをします。あなたができるもう1つのことはパイプであり、便利なことにその例も示しています:)。"
from multiprocessing import Process, Pipe
def f(conn):
conn.send([42, None, 'hello'])
conn.close()
if __name__ == '__main__':
parent_conn, child_conn = Pipe()
p = Process(target=f, args=(child_conn,))
p.start()
print parent_conn.recv() # prints "[42, None, 'hello']"
p.join()
この場合、パイプを手動で使用して、完成した結果を「親プロセス」にスローします。
また、うまくピクルできないケースを見つけることもあるので、彼がここに投稿することでmultiprocessing
、この素晴らしい回答(または私の修正された特殊なバリアント)を使用します:mrule
"
from multiprocessing import Process, Pipe
from itertools import izip
def spawn(f):
def fun(pipe,x):
pipe.send(f(x))
pipe.close()
return fun
def parmap(f,X):
pipe=[Pipe() for x in X]
proc=[Process(target=spawn(f),args=(c,x)) for x,(p,c) in izip(X,pipe)]
[p.start() for p in proc]
[p.join() for p in proc]
return [p.recv() for (p,c) in pipe]
if __name__ == '__main__':
print parmap(lambda x:x**x,range(1,5))
"
ただし、これはプロセスの制御を手動で引き継ぐため、特定のものが「死んだ」プロセスを放置する可能性があることに注意してください。これは良いことではありません。たとえば、予期しないシグナルです。けれど :)。
これらのコマンドが python にない場合、たとえば実行したい場合は、ls
を使用することでより適切に機能する可能性があります。これは、使いやすく、より柔軟なツールであると見なされているため、必ずしも使用するのは良いことではありません。については、ここで少し説明します。subprocess
os.system
subprocess
プロセスが外部スクリプトの場合は、subprocessモジュールを使用してみてください。ただし、コードは、関数を並列で実行することを示唆しています。これには、マルチプロセッシングモジュールを試してください。マルチプロセッシングの使用に関する特定の詳細については、この回答からのいくつかのコード:
def foo(bar, baz):
print 'hello {0}'.format(bar)
return 'foo' + baz
from multiprocessing.pool import ThreadPool
pool = ThreadPool(processes=1)
async_result = pool.apply_async(foo, ('world', 'foo')) # tuple of args for foo
# do some other stuff in the other processes
return_val = async_result.get() # get the return value from your function.