gpt4 book ai didi

python - 在嵌套循环中使用 multiprocessor.Pool 的正确方法

转载 作者:太空狗 更新时间:2023-10-29 17:24:28 30 4
gpt4 key购买 nike

我正在使用 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() 提供了一个同步点它可以报告工作进程中发生的一些异常,否则您将看不到这些异常。

玩得开心:-)

关于python - 在嵌套循环中使用 multiprocessor.Pool 的正确方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20387510/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com