我能从多处理中得到一个返回值吗?

2024-05-15 11:26:16 发布

您现在位置:Python中文网/ 问答频道 /正文

我使用Python多处理模块在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]

然而,当我查看结果列表时,看起来monte carlo迭代器甚至还没有启动。我知道他们有,因为我可以让程序在蒙特卡罗步骤中打印出信息。所以我在做傻事。我原以为job.join()会使结果列表在运行之前不被构造,因此mc.results字段会被更新。

我意识到我没有告诉你我的蒙特卡罗程序的细节,希望这不重要,我犯的错误是在我对多处理的解释中。提前感谢您的帮助。


Tags: 模块代码in程序列表forjobsjob
1条回答
网友
1楼 · 发布于 2024-05-15 11:26:16

MonteCarlo对象已被pickle并发送到要运行的子进程-此进程中的.results属性未填充,因为本地mc从未运行过。

如果您创建了一个^{},您可以将其传递到每个MonteCarlo作业中,当它完成时,应该将结果放在其中。然后顶层可以等待队列中的值。(在引擎盖下,这将pickle和unpickle结果对象。)

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]

相关问题 更多 >