多处理仅适用于第一次迭代

Multiprocessing only works for the first iteration

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

这是我的问题:

  1. 为什么只计算了第一次迭代。
  2. 如何return每个数组分别为 B、C 和 D。
  3. 我真正的计算确实有太多的工作人员需要计算和return,所以有没有比将我所有的语句包装在一个函数中然后return它们全部更有效的方法。 谢谢

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. 如果没有看到可重现的代码,很难找到处理作业的最有效方法。要运行多个函数,请参考后面的link;

Mulitprocess Pools with different functions