[问题] Pool and for loop

楼主: Draic5566 (拼错的狄拉克)   2021-08-06 11:59:48
Code 先奉上:
from multiprocessing import Pool
import numpy as np
Nj=2
Dataold=np.zeros((5,Nj))
def MT(i):
DataMT=np.zeros((Nj))
for j in range(0,Nj):
DataMT[j]=Dataold[i,j]+i
return DataMT
if __name__=='__main__':
for k in range(0,2):
pool = Pool(processes=6)
list_start_vals = range(0, 5)
array_3D = np.array(pool.map(MT, list_start_vals))
Dataold = array_3D
print(array_3D[4,0])
pool.close()
output:
4.0
4.0
问题:
原本预计第二个4.0应该要是8.0,因为认为Dataold = array_3D会把原本定
义的Dataold取代掉,并带入第二圈的k循环,但事实上并没有。
解: 没事了... 我改在linux上跑就没问题
而windows会跑失败,原因大概是spawn和folk的设定差异
(此文不删,留给有类似问题的人参考)
描述:
1. 第一个4.0是来自于 k=0, 第二个是 k=1
2. 其中一个解法: 把pool.map 改成pool.starmap,并且把Dataold当作参数
但实际要跑的code很巨大,Dataold会是一个巨大的array
因此这样写code会跑很慢很没效率
3. pool.map 会给一个 1*2 的 array
而np.array(pool.map(....))会把上面的array排成 5*2 array
感谢! 我只有微薄的P币能够报恩,谢谢
作者: aassdd926 (打东东)   2021-08-06 15:52:00
不知道为何如此,但我会试试看 pass 1D array 进去,不要让mulitiprocessing 的function access a globalvariable,然后再把吐出来的1D array叠起来,因为以我的了解,不同的process memory space不同

Links booklink

Contact Us: admin [ a t ] ucptt.com