1

私はいくつかのプロセスを一緒にやっています。各プロセスはいくつかの結果を返します。それらのプロセスからそれらの結果をどのように収集しますか。

 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いくつかの結果を返します。これらの結果を収集し、変数に保存したいと思います。

4

3 に答える 3

1

したがって、今のところ、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を使用することでより適切に機能する可能性があります。これは、使いやすく、より柔軟なツールであると見なされているため、必ずしも使用するのは良いことではありません。については、ここで少し説明します。subprocessos.systemsubprocess

于 2013-07-29T16:12:02.450 に答える
0

プロセスが外部スクリプトの場合は、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.
于 2013-07-29T15:39:04.493 に答える