当前位置: 首页 > 面试题库 >

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

单于海荣
2023-03-14
问题内容

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

玩得开心 :-)



 类似资料:
  • 在学习Java 8 streams和lambas时,我尝试用streams替换以下嵌套for循环: 循环迭代“ProvidedService”对象的列表,对于每个对象,循环遍历“Desk”对象的列表属性,并将“Id”字段提取到列表中。 我使用streams生成了以下代码: 这是正确/最佳的方法吗?或者有没有一种方法可以在没有第二个嵌套流的情况下实现这一点?

  • 我用For创建了一个嵌套循环,这是程序代码和输出,然后我尝试了同时循环,得到了不同的结果 对于 虽然 请引导我。。谢谢

  • 本文向大家介绍在Python的while循环中使用else以及循环嵌套的用法,包括了在Python的while循环中使用else以及循环嵌套的用法的使用技巧和注意事项,需要的朋友参考一下 循环使用 else 语句 在 python 中,for … else 表示这样的意思,for 中的语句和普通的没有区别,else 中的语句会在循环正常执行完(即 for 不是通过 break 跳出而中断的)的情况

  • 在Haskell中执行嵌套循环有两种明显的“惯用”方法:使用列表monad或使用 : 在1s内运行。这个库使用得不多,也远不是惯用的,那么,获得快速恒定空间二维计算的惯用方法是什么呢?(注意,这不是REPA的情况,因为我想在网格上执行任意IO操作。)

  • 我在下面的代码中使用了嵌套的for循环,并且我有一些条件来中断内部的for循环,这提高了代码的性能。 现在,如何使用 Java 8 流来执行相同的逻辑?我想出了下面的代码: 在这里,我不能在java流中使用< code>break语句,所以我使用了< code>return语句,但它仍然运行内部循环,因为它不会中断内部循环,所以性能没有提高。

  • 问题内容: 在学习Java 8流和lambas时,我尝试用流替换以下嵌套的for循环: 该循环迭代“ ProvidedService”对象的列表,并针对每个对象循环访问“ Desk”对象的list属性,并将“ Id”字段提取到列表中。 我想出了以下使用stream的代码: 这是正确/最佳的方式吗?还是有没有第二个嵌套流的方法来执行此操作? 问题答案: 我可能会这样写: