我需要做一些強烈的數值計算,幸運的是python提供了非常簡單的方法來實現並行化。然而,我得到的結果是非常奇怪的,經過一些trial'n錯誤,我偶然發現了這個問題。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.
我懷疑有些內存分配給所有子進程... 我想知道這裏發生了什麼以及什麼是什麼修復看起來像。 :)
感謝
嗯。很高興知道,謝謝,但不幸的是,我無法看到一種方法來實現我的例程,因爲我使用隨機數生成器多次使用不同的實例。有沒有解決這個問題的另一種方法? – HansSnah 2014-11-06 18:23:21
在並行計算隨機數之前,使用'numpy.random.seed'將種子分發到每個進程。這需要獲得獨特的種子,這可能就像在主進程中生成一些隨機數字一樣簡單,或者只是枚舉池中工作人員的數量1到n。 – mobiusklein 2014-11-06 18:28:59
啊!確實。如果我簡單地把np.random.seed()放在get_random函數中,我會得到不同的結果。完美和非常感謝! – HansSnah 2014-11-06 18:55:36