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

Ric*_*ick 31 python multiprocessing

我使用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]
Run Code Online (Sandbox Code Playgroud)

但是,当我查看结果列表时,看起来monte carlo迭代器甚至还没有开始.我知道他们有,因为我可以在monte carlo步骤中打印出信息.所以我做的事情是愚蠢的.我原以为job.join()会保留结果列表,直到所有内容都运行,因此mc.results字段会被更新.

我意识到我没有告诉你我的蒙特卡洛例程的细节,并希望它没关系,而我所犯的错误在于我对多处理工作的解释.提前感谢您提供的任何帮助.

bab*_*unk 42

MonteCarlo对象已被酸洗发送到子进程来运行-将.results在此过程中属性将不会填充因为当地mc从来没有运行.

如果你创建了一个multiprocessing.Queue,你可以将它传递给每个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]
Run Code Online (Sandbox Code Playgroud)