Python并行编程问题

时间:2014-11-06 17:37:06

标签: python parallel-processing

我需要做一些激烈的数值计算,幸运的是python提供了非常简单的方法来实现并行化。然而,我得到的结果是完全奇怪的,经过一些试验的错误,我偶然发现了问题。

以下代码只是计算随机数字样本的平均值,但说明了我的问题:

import multiprocessing
import numpy as np
from numpy.random import random

# Define function to generate random number
def get_random(seed):
    dummy = random(1000) * seed
    return np.mean(dummy)

# Input data
input_data = [100,100,100,100]

pool = multiprocessing.Pool(processes=4)
result = pool.map(get_random, input_data)
print result 

for i in input_data:
    print get_random(i)

现在输出如下:

[51.003368466729405, 51.003368466729405, 51.003368466729405, 51.003368466729405]

用于并行化,它始终是相同的

和正常的非并行循环一样:

50.8581749381
49.2887091049
50.83585841
49.3067281055

正如您所看到的,并行化只返回相同的结果,即使它应该具有计算差异意味着就像循环一样。现在,有时我只得到3个相同的数字,其中一个与另外3个不同。

我怀疑某些内存被分配给所有子进程...... 我会喜欢这里发生的事情的一些提示以及修复的样子。 :)

感谢

2 个答案:

答案 0 :(得分:2)

当您使用multiprocessing时,您正在谈论不同的流程。不同的流程意味着不同的Python解释器。不同的解释器意味着不同的随机状态。如果您没有在每个进程上唯一地播种随机数生成器,那么您将从每个进程获得相同的起始随机状态。

答案 1 :(得分:0)

答案是在每个过程中添加一个新的随机种子。将功能更改为

def get_random(seed):
    np.random.seed()
    dummy = random(1000) * seed
    return np.mean(dummy)

给出想要的结果。