多处理仅适用于第一次迭代 [英] Multiprocessing only works for the first iteration

查看:16
本文介绍了多处理仅适用于第一次迭代的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在尝试使用Python多处理。我将语句包装在一个函数中,然后使用多处理映射循环遍历该函数。我发现只有第一个迭代真正被处理了,而其余的没有(我通过打印结果进行了检查)。

以下是我的问题:

  1. 为什么只计算第一次迭代。
  2. 如何分别返回B、C、D三个数组
  3. 我的实际计算确实有太多的员工要计算和返回,所以有一个比将我所有的语句包装在一个函数中然后返回它们更高效的方法。 谢谢

import numpy as np
import multiprocessing as mp

B=np.full((5,4,4),np.nan)
C=np.full((5,4,4),np.nan)
D=np.full((5,4,4),np.nan)


def job1(i):
    print(i)
    A=np.ones((4,4))
    B[i,:,:]=A+1
    C[i,:,:]=2*A+2
    D[i,:,:]=A+5
    return B,C,D
#%%

P=mp.Pool(5)
result=P.map(job1,np.arange(5))
P.close()
P.join()



result[0] 
(array([[[ 2.,  2.,  2.,  2.],
         [ 2.,  2.,  2.,  2.],
         [ 2.,  2.,  2.,  2.],
         [ 2.,  2.,  2.,  2.]],

        [[nan, nan, nan, nan],
         [nan, nan, nan, nan],
         [nan, nan, nan, nan],
         [nan, nan, nan, nan]],

        [[nan, nan, nan, nan],
         [nan, nan, nan, nan],
         [nan, nan, nan, nan],
         [nan, nan, nan, nan]],

        [[nan, nan, nan, nan],
         [nan, nan, nan, nan],
         [nan, nan, nan, nan],
         [nan, nan, nan, nan]],

        [[nan, nan, nan, nan],
         [nan, nan, nan, nan],
         [nan, nan, nan, nan],
         [nan, nan, nan, nan]]]),

推荐答案

  1. 您的代码按预期工作。您有5个处理器(Pool(5))和5个要做的事情(np.arange(5)),所以每个任务都由每个处理器执行。由于评论中提到的@Michael Butscher原因,每个计算都不会共享。

  2. 您可以通过Pool操作得到结果后进行解析,如下所示(直观);

output = {'B':[], 'C':[], 'D':[]}
for r in result:
    output['B'].append(r[0])
    output['C'].append(r[1])
    output['D'].append(r[2])
  1. 如果看不到可重现的代码,就很难找出处理作业的最有效方法。要运行多个函数,请参阅以下链接;

Mulitprocess Pools with different functions

这篇关于多处理仅适用于第一次迭代的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆