多处理仅适用于第一次迭代
Multiprocessing only works for the first iteration
我正在尝试使用 Python 多处理。我将我的语句包装在一个函数中,然后我使用多处理映射来遍历该函数。我发现只有第一次迭代被真正处理了,其余的没有(我通过打印结果来检查)。
这是我的问题:
- 为什么只计算了第一次迭代。
- 如何return每个数组分别为 B、C 和 D。
- 我真正的计算确实有太多的工作人员需要计算和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]]]),
您的代码按预期工作。您有 5 个处理器 (Pool(5)
) 和 5 件事情要做 (np.arange(5)
),因此每个任务都由每个处理器执行。由于@Michael Butscher 在评论中提到的原因,每个计算都没有共享。
你可以在Pool
操作得到结果后解析如下(直观的方式);
output = {'B':[], 'C':[], 'D':[]}
for r in result:
output['B'].append(r[0])
output['C'].append(r[1])
output['D'].append(r[2])
- 如果没有看到可重现的代码,很难找到处理作业的最有效方法。要运行多个函数,请参考后面的link;
Mulitprocess Pools with different functions
我正在尝试使用 Python 多处理。我将我的语句包装在一个函数中,然后我使用多处理映射来遍历该函数。我发现只有第一次迭代被真正处理了,其余的没有(我通过打印结果来检查)。
这是我的问题:
- 为什么只计算了第一次迭代。
- 如何return每个数组分别为 B、C 和 D。
- 我真正的计算确实有太多的工作人员需要计算和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]]]),
您的代码按预期工作。您有 5 个处理器 (
Pool(5)
) 和 5 件事情要做 (np.arange(5)
),因此每个任务都由每个处理器执行。由于@Michael Butscher 在评论中提到的原因,每个计算都没有共享。你可以在
Pool
操作得到结果后解析如下(直观的方式);
output = {'B':[], 'C':[], 'D':[]}
for r in result:
output['B'].append(r[0])
output['C'].append(r[1])
output['D'].append(r[2])
- 如果没有看到可重现的代码,很难找到处理作业的最有效方法。要运行多个函数,请参考后面的link;
Mulitprocess Pools with different functions