在嵌套循环中使用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 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()提供了一个同步点,可报告,发生在工作进程有些例外,你否则永远不会看到。

玩得开心 :-)

以上是 在嵌套循环中使用multiprocessor.Pool的正确方法 的全部内容, 来源链接: utcz.com/qa/399513.html

回到顶部