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

时间:2019-07-30 02:37:44

标签: python python-3.x python-multiprocessing

我正在尝试使用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 个答案:

答案 0 :(得分:1)

  1. 您的代码可以正常工作。您有5个处理器(foo Bar.)和5个要做的事情(Pool(5)),因此每个任务都由每个处理器执行。由于注释中提到了@Michael Butscher的原因,因此未共享每次计算。

  2. 您可以通过下面的np.arange(5)操作(一种直观的方式)对结果进行解析;

Pool
  1. 很难找到最有效的方式来处理您的工作,而不会看到可重复的代码。要运行多种功能,请参考以下链接;

Mulitprocess Pools with different functions