在python中从不同进程收集结果

在python中从不同进程收集结果,python,parallel-processing,Python,Parallel Processing,我正在一起做几个过程。每个过程都会返回一些结果。我将如何从这些过程中收集这些结果 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\u此任务返回一些结果。我想收集这些结果并将它们保存在某个变量中 如果流程是外部脚本,请尝试使用模块。但是,您的代码表明您希望并行运行函数。为此,请尝试模块。有关使用多处理

我正在一起做几个过程。每个过程都会返回一些结果。我将如何从这些过程中收集这些结果

 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\u此任务返回一些结果。我想收集这些结果并将它们保存在某个变量中

如果流程是外部脚本,请尝试使用模块。但是,您的代码表明您希望并行运行函数。为此,请尝试模块。有关使用多处理的特定详细信息,请参阅答案中的一些代码:

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.

所以现在我建议您应该使用python模块的池,因为它可以为您处理很多事情。你能详细说明一下你在做什么,为什么要直接使用我假设的
多处理.Process

如果仍要直接使用
多处理.Process
,则应使用队列获取返回值

文件中给出的示例:

"

"-

因此,进程通常是在后台运行的,一般来说,如果您使用它们进行多处理,您需要“丢弃”数据,因为进程不像线程那样具有共享内存-这就是为什么您使用队列-它为您这样做。您可以做的另一件事是管道,它们也方便地给出了一个例子:)。 "

" -

在这种情况下,它所做的是手动使用管道将完成的结果传递给“父进程”

有时我也会发现
multiprocessing
无法很好地处理的情况,因此我使用了
mrule
发布的这一伟大答案(或我修改的专用变体):

"

"

但是,您应该注意,这会手动接管进程的控制,因此某些事情可能会留下“死”进程—这不是一件好事,例如意外信号—这是一个使用管道进行多处理的示例:)


如果这些命令不在python中,例如,您想运行
ls
,那么使用
subprocess
可能会更好,因为
os.system
不再是一个好东西,因为现在人们认为
subprocess
是一个更容易使用和更灵活的工具,本文对此进行了一个小讨论

您可以使用


或者,如果您想尝试使用多线程,请查看此项。

使用
多处理
模块中的
apply\u async
,如前所述
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()
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()
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))
from multiprocessing import Pool

mydict = {}
with Pool(processes=5) as pool:
        task_1 = pool.apply_async(do_this_task,args=(para_1,para_2))
        task_2 = pool.apply_async(do_this_task,args=(para_1,para_2))
        mydict.update({"task_1": task_1.get(), "task_2":task_2.get()})
print(mydict)