Pool.starmap 为每个调用的进程提供相同的结果

时间:2021-03-18 16:32:49

标签: python numpy python-multiprocessing

我有一个返回随机 numpy 数组的函数

def rand_weights(assets,lst,l,m):
    #
    df_ranges=pd.DataFrame(lst,index=assets,columns=['range low','range high']).transpose()
    #
    arr_ranges_low=df_ranges[assets].values[0]
    arr_ranges_high=df_ranges[assets].values[1]
    #
    rands=np.zeros(l)
    weights=np.zeros((m,l))
    for k in range(m):
        while rands.sum()!=1000:
            rands=np.array([np.random.randint(
                arr_ranges_low[i],arr_ranges_high[i]
                ) for i in range(l)])
            if rands.sum()==100:
                weights[k]=rands
                break
    ##
    return weights

例如:

##
l=8
m=5
lst=[[0,25],[0,10],[0,25],[0,20],
[0,12],[0,10],[0,10],[0,15],[0,4],[0,4],[0,4]]
rand_weights(assets,lst,l,m)
#
array([[23.,  9., 19., 19.,  7.,  7.,  4., 12.],
       [22.,  0., 22., 19.,  6.,  9.,  9., 13.],
       [20.,  5., 23., 17.,  8.,  7.,  9., 11.],
       [23.,  8., 24., 15., 10.,  2.,  8., 10.],
       [21.,  9., 22., 18.,  7.,  3.,  6., 14.]])

我正在使用 pool.starmap() 在多个进程上调用 rand_weights n_iter 次(此处用于测试:1000)

def MP_a_func(func,iterable,proc,chunk):
    #
    pool=multiprocessing.Pool(processes=proc)
    Result=pool.starmap_async(func,iterable,chunksize=chunk)
    pool.close()
    #
    return Result

同时使用 rand_weightsMP_a_func 时:

n_iter=1000
iterable=[[assets,lst,l,m] for n in range(n_iter)]
if __name__ == '__main__':
    de_weights=MP_a_func(rand_weights,iterable,proc,chunk)
    weights=de_weights.get()

proc=2proc=3 时,每个进程都会得到相同的结果,例如:

>>> weights[0]
array([[ 0.,  9.,  5.,  7.,  8.,  6., 12.,  0.,  0.,  2., 51.],
       [10.,  0.,  6.,  6.,  9.,  2.,  5.,  3.,  0.,  3., 56.],
       [ 0., 17.,  2.,  5.,  9.,  8.,  2.,  3.,  1., 11., 42.],
       [ 5.,  6.,  3., 11.,  5.,  9., 10.,  1.,  0., 10., 40.],
       [ 3.,  8., 17., 10.,  6.,  2.,  2.,  0.,  0.,  7., 45.]])
##
>>>weights[2]
#
array([[ 0.,  9.,  5.,  7.,  8.,  6., 12.,  0.,  0.,  2., 51.],
       [10.,  0.,  6.,  6.,  9.,  2.,  5.,  3.,  0.,  3., 56.],
       [ 0., 17.,  2.,  5.,  9.,  8.,  2.,  3.,  1., 11., 42.],
       [ 5.,  6.,  3., 11.,  5.,  9., 10.,  1.,  0., 10., 40.],
       [ 3.,  8., 17., 10.,  6.,  2.,  2.,  0.,  0.,  7., 45.]])

所以结果如 weights[2]=weights[0]; weights[1]=weights[3] ....

我该如何解决这个问题?

问候,

0 个答案:

没有答案