使用python多处理并行化蒙特卡罗方法时的问题

时间:2018-05-17 08:01:08

标签: python numpy python-multiprocessing montecarlo

我想加速蒙特卡罗方法,该方法基于多处理模块的numpy操作。我已阅读enter link description here并为某些任务编写了如下代码:

import func1, func2, func3, ... #some manipulations on the SAME numpy ndarray but each of then works independantly returns a independant result
import multiprocessing as mp
if __name__ == '__main__':
   with mp.Pool(processes=mp.cpu_count()) as pool:
   task1 = pool.Process(target=fun1, args(arg1, arg2, ...)
   task2 = pool.Process(target=fun2, args(arg1, arg2, ...)
   task3 = pool.Process(target=fun3, args(arg1, arg2, ...)
   ...
   task1.start()
   task2.start()
   task3.start()
   ...
   variable1 = task1.join() #In my case, I need to get the returns of these functions
   variable2 = task2.join()
   variable3 = task3.join()
   ...

与大多数教程一样。但我得到了一个

  

RuntimeError:之前已尝试启动新进程   当前进程已完成自举阶段。

我在这个领域真的很新,并且在我发布这个问题之前已经挣扎了几天。有人可以给我一些建议吗?

1 个答案:

答案 0 :(得分:0)

当我在MacOS上运行相同的程序时,我发现了这个RunTimeError问题。实际上,这个RuntimeError是由于how Windows编译.py文件的方式。

要纠正这个问题,最简单的方法是将程序的主体传递给函数main()(尽管在我的情况下很复杂),然后在freeze_support()中添加multipleprocessing {1}}模块。所以最终看起来像这样: 导入func1,func2,func3,... #some操作在SAME numpy ndarray上,但每个都独立工作返回一个独立的结果

import multiprocessing as mp
from multiprocessing import freeze_support()
def main():
   with mp.Pool(processes=mp.cpu_count()) as pool:
      task1 = pool.Process(target=fun1, args(arg1, arg2, ...)
      task2 = pool.Process(target=fun2, args(arg1, arg2, ...)
      task3 = pool.Process(target=fun3, args(arg1, arg2, ...)
      ...
      task1.start()
      task2.start()
      task3.start()
      ...
      variable1 = task1.join() #In my case, I need to get the returns of these functions
      variable2 = task2.join()
      variable3 = task3.join()
      ...
if __name__ == '__main__':
   freeze_support()
   main()