为什么此并行化脚本未返回正确的结果?

时间:2018-08-16 00:45:32

标签: python asynchronous parallel-processing multiprocessing

我正在尝试学习如何使用Python的multiprocessing模块。我尝试着以非并行和并行的方式编写相同的代码。问题在于他们返回的结果不同。

这是非并行版本:

import numpy as np

m = 3
num_points = 200
iterMax = 20
NMax = 3
np.random.seed(0)
y = np.random.rand(num_points,m)
w = list(range(NMax - 1))

for N in range(NMax-1):
    w[N] = np.random.uniform(0,1,(N+2,np.size(y,axis=1))) - 0.5
    iterCount = 1
    while iterCount < iterMax:
        for selectedInput in y:
            w[N] = w[N] + (np.random.rand() - 0.5) * selectedInput
        iterCount += 1    

for i in w:
    print(i)

这是并行化的版本:

import numpy as np
import multiprocessing as mp

m = 3
num_points = 200
iterMax = 20
NMax = 3
np.random.seed(0)
y = np.random.rand(num_points,m)

def neuron_run(N):
    w = np.random.uniform(0,1,(N+2,np.size(y,axis=1))) - 0.5 # Initialize weights
    iterCount = 1
    while iterCount < iterMax:
        for selectedInput in y: 
            w = w + (np.random.rand() - 0.5) * selectedInput
        iterCount += 1    
    return w

if __name__ == '__main__':
    w = []
    pool = mp.Pool(processes=NMax)
    for N in range(NMax-1):
        pool_result = pool.apply_async(neuron_run, args = (N,))
        w.append(pool_result.get())
    pool.close()
    pool.join()
    for i in w:
        print(i)

由于以下行,两者都应返回相同的wnp.random.seed(0)。但事实并非如此。

错误在哪里?我找不到它。

1 个答案:

答案 0 :(得分:2)

seed强制“随机”结果重复,是的。

但是,如果您并行运行多个进程,则每个进程都有其自己的种子值和随机值。

例如,如果带有seed的单进程代码产生了这六个“随机”值:5、6、7、8、9、10,则在六个进程中执行一个random parallel将在每个变量中仅生成第一个值(5)。同样,在三个进程中执行两个random调用将在每个进程中生成“随机”值5和6。

换句话说,不要期望random.seed在多个过程中做您想做的事情。那永远都行不通。