在嵌套循环中使用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

