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

 纽约纽约MrWaNg 发布于 2023-02-12 18:58

我正在使用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()"行; 这样做有什么好处?

谢谢!

1 个回答
  • 理想情况下,您应该只调用Pool()一次构造函数 - 而不是一遍又一遍.创建工作进程时会产生大量开销,并且每次调用时都要支付这些成本Pool().单个Pool()呼叫创建的进程保持不变!当他们完成你在程序的一个部分给他们的工作时,他们会坚持下去,等待更多的工作要做.

    至于Pool.close(),你应该在 - 当时 - 你永远不会向Pool实例提交更多工作时调用它.因此Pool.close()通常在主程序的可并行化部分完成时调用.然后,当已经分配的所有工作都已完成时,工作进程将终止.

    调用Pool.join()等待工作进程终止也是一种很好的做法.除了其他原因之外,通常没有好的方法来报告并行化代码中的异常(异常发生在上下文中,与主程序正在做的事情只有模糊相关),并Pool.join()提供了一个同步点,可以报告您在工作进程中发生的一些异常否则永远不会看到.

    玩得开心 :-)

    2023-02-12 19:00 回答
撰写答案
今天,你开发时遇到什么问题呢?
立即提问
热门标签
PHP1.CN | 中国最专业的PHP中文社区 | PNG素材下载 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有