在嵌套循环中使用multiprocessor.Pool的正确方法
我正在使用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 multiprocessingfrom 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()
提供了一个同步点,可报告,发生在工作进程有些例外,你否则永远不会看到。
玩得开心 :-)
以上是 在嵌套循环中使用multiprocessor.Pool的正确方法 的全部内容, 来源链接: utcz.com/qa/399513.html