我可以从multiprocessing.Process中获取返回值吗?

37 投票
1 回答
46707 浏览
提问于 2025-04-17 07:24

我在用Python的多进程模块实现一些简单的并行计算,做的是蒙特卡洛模拟。我的代码大概是这样的:

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字段就会被更新。

我意识到我没有告诉你们我的蒙特卡洛程序的具体细节,希望这不影响理解,我觉得我犯的错误可能是对多进程功能的理解有问题。提前感谢你们提供的任何帮助。

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]

撰写回答