我想加速蒙特卡罗方法,该方法基于多处理模块的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:之前已尝试启动新进程 当前进程已完成自举阶段。
我在这个领域真的很新,并且在我发布这个问题之前已经挣扎了几天。有人可以给我一些建议吗?
答案 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()