2012-06-13 52 views
5

我想分享我的過程之間的字典如下之間的字典:Python的共享並行處理

def f(y,x): 
    y[x]=[x*x]               

if __name__ == '__main__': 
    pool = Pool(processes=4) 
    inputs = range(10) 
    y={}        
    result = pool.map(f,y,inputs) 

的Y返回{}。我怎樣才能使它工作?

感謝,

+1

這聽起來像Redis的工作! –

+0

什麼是Redis? – Amir

+2

http://www.google.com/search?q=redis –

回答

9

這就像你正在使用的multiprocessing模塊。你沒有說,這是一個重要的信息。

multiprocessing.Pool()實例上的.map()函數有兩個參數:函數和序列。該函數將使用序列中的連續值調用。您正試圖通過y和一個序列,並且不起作用。

你可以像這樣做一個序列:((y, x) for x in input),然後編寫一個函數,它接受一個參數,一個元組,然後用它做正確的事情。

我只使用multiprocessing.Pool()來運行讀取和寫入磁盤文件的進程,所以我不確定這裏的基本思路是如何工作的:我不確定你是否可以像你正在嘗試的那樣改變字典。

我建議只將值從函數中傳回來,然後收集它們以獲得最終結果。我只是測試此代碼,它的工作原理:

import multiprocessing as mp 

def f(x): 
    return (x, x*x) 

if __name__ == '__main__': 
    pool = mp.Pool() 
    inputs = range(10) 
    result = dict(pool.map(f, inputs)) 

result設置爲:{0: 0, 1: 1, 2: 4, 3: 9, 4: 16, 5: 25, 6: 36, 7: 49, 8: 64, 9: 81}

讓我們改變它,這樣,而不是計算x*x它會提高x一些權力,將提供一種動力。讓我們把它作爲一個字符串的關鍵參數。這意味着f()需要採用元組參數,其中元組將爲(key, x, p),並且它將計算x**p

import multiprocessing as mp 

def f(tup): 
    key, x, p = tup # unpack tuple into variables 
    return (key, x**p) 

if __name__ == '__main__': 
    pool = mp.Pool() 
    inputs = range(10) 
    inputs = [("1**1", 1, 1), ("2**2", 2, 2), ("2**3", 2, 3), ("3**3", 3, 3)] 
    result = dict(pool.map(f, inputs)) 

如果您有多個序列,你需要加入他們的行列,共同作出上述單個序列,考慮使用zip()或許itertools.product

+0

如何向f添加一個參數?我做了def f(x,i):....然後pool.map(f,inputs,1),但python不喜歡它。它返回f()只需要2個參數 – Amir

+1

'pool.map()'接受一個函數和一個序列。序列可以是一系列元組或列表,這就是你將如何傳遞附加參數。我會再添加一個例子。 – steveha

+1

如果您真的想在進程之間共享字典,請查看多處理模塊中的Manager.dict。 – danielm