gpt4 book ai didi

python - 在python中收集不同进程的结果

转载 作者:行者123 更新时间:2023-12-01 05:39:44 25 4
gpt4 key购买 nike

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

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

最佳答案

所以现在我建议你应该使用 python multiprocessing模块的池,因为它可以为您处理很多事情。您能否详细说明您正在做什么以及为什么要直接使用我假设的 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()

“- Multiprocessing Docs

因此,进程通常在后台运行以执行一般操作,如果您对它们进行多处理,则需要“丢弃”数据,因为进程没有像线程那样的共享内存 - 所以这就是您使用的原因队列 - 它会为你做这件事。您可以做的另一件事是管道,并且他们也方便地给出了一个示例:)。”

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 Docs

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

有时我发现多处理无法很好地处理的情况,所以我使用他发布的mrule这个很好的答案(或我修改后的专门变体)here :

"

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 是一种更易于使用且更灵活的工具,因此提出了一个小型讨论 here

关于python - 在python中收集不同进程的结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17927173/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com