我正在使用multiprocessor.Pool()模块来加速"令人尴尬的并行"循环.我实际上有一个嵌套循环,并使用multiprocessor.Pool加速内循环.例如,如果没有并行化循环,我的代码将如下所示:
outer_array=[random_array1] inner_array=[random_array2] output=[empty_array] for i in outer_array: for j in inner_array: output[j][i]=full_func(j,i)
并行化:
import multiprocessing from functools import partial outer_array=[random_array1] inner_array=[random_array2] output=[empty_array] for i in outer_array: partial_func=partial(full_func,arg=i) pool=multiprocessing.Pool() output[:][i]=pool.map(partial_func,inner_array) pool.close()
我的主要问题是,如果这是正确的,我应该在循环中包含multiprocessing.Pool(),或者如果我应该在循环外创建池,即:
pool=multiprocessing.Pool() for i in outer_array: partial_func=partial(full_func,arg=i) output[:][i]=pool.map(partial_func,inner_array)
另外,我不确定我是否应该在上面第二个例子的每个循环结尾处包含"pool.close()"行; 这样做有什么好处?
谢谢!
理想情况下,您应该只调用Pool()
一次构造函数 - 而不是一遍又一遍.创建工作进程时会产生大量开销,并且每次调用时都要支付这些成本Pool()
.单个Pool()
呼叫创建的进程保持不变!当他们完成你在程序的一个部分给他们的工作时,他们会坚持下去,等待更多的工作要做.
至于Pool.close()
,你应该在 - 当时 - 你永远不会向Pool
实例提交更多工作时调用它.因此Pool.close()
通常在主程序的可并行化部分完成时调用.然后,当已经分配的所有工作都已完成时,工作进程将终止.
调用Pool.join()
等待工作进程终止也是一种很好的做法.除了其他原因之外,通常没有好的方法来报告并行化代码中的异常(异常发生在上下文中,与主程序正在做的事情只有模糊相关),并Pool.join()
提供了一个同步点,可以报告您在工作进程中发生的一些异常否则永远不会看到.
玩得开心 :-)