我能否从multiprocessing.Process中获得返回值?

37

我使用Python的multiprocessing模块在Monte Carlo代码中实现了一些简单的并行计算。我的代码看起来像这样:

montecarlos = [MonteCarlo(f,fargs) for fargs in farglist]
jobs = [multiprocessing.Process(mc) for mc in montecarlos]
for job in jobs: job.start()
for job in jobs: job.join()
results = [mc.results for mc in montecarlos]
然而,当我查看结果列表时,它好像连蒙特卡罗迭代器都没有开始。我知道它们已经开始了,因为在蒙特卡罗步骤中,我可以让进程打印出信息。所以我做了一些愚蠢的事情。我原本认为job.join()会使结果列表在所有东西都运行完之前不会被构建,因此mc.results字段会得到更新。
我意识到我没有告诉你我的蒙特卡罗例程的详细信息,并希望这并不重要,而我犯的错误是对multiprocessing做法的理解问题。提前感谢您提供的任何帮助。
1个回答

46

MonteCarlo 对象已经被序列化并发送到子进程去运行 - 在这个进程中,.results 属性没有被填充,因为本地的 mc 没有被运行过。

如果创建一个multiprocessing.Queue,你可以将其传递给每个 MonteCarlo 任务,在任务完成后应将结果放入队列中。然后顶层代码可以从队列中等待结果值。(在底层,这将序列化和反序列化结果对象。)

result_queue = multiprocessing.Queue()
montecarlos = [MonteCarlo(result_queue, f,fargs) for fargs in farglist]
jobs = [multiprocessing.Process(mc) for mc in montecarlos]
for job in jobs: job.start()
for job in jobs: job.join()
results = [result_queue.get() for mc in montecarlos]

这个很好用!非常感谢!同时也感谢你对发生的事情进行了如此清晰的解释。 - Rick
这个不支持Python3,请更新一下! - Trect
1
第二行中的 "f" 指的是 montecarlos = [MonteCarlo(result_queue, f,fargs) for fargs in farglist] 中的变量。 - pelos
1
“f” 是原始代码中的内容,是使用蒙特卡罗技术分析的某个函数。 - babbageclunk

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接