2013-04-15 65 views
0

我認爲我明白這個問題,當一個multiprocessing.Pool.map工人抓住它的下一個任務時,根據文檔將參數作爲拾取對象傳遞。這很好,如果返回值是你正在尋找的,但是如果我想調用一個函數,並行地改變對象的狀態?例如,考慮簡單對象:如何獲得多處理來更改我的原始對象的狀態?

from multiprocessing import Pool 

class state(): 
    def __init__(self): 
     self.z = 0 
    def __repr__(self): 
     return "%s"%self.z 
    def compute(self): 
     print "Computing" 
     self.z += 1 

而且一些操作與此對象:

def compute_function(x): x.compute() 

A = [state() for _ in xrange(3)] 
print A 
A[2].compute() 
print A 
map(compute_function, A) 
print A 
P = Pool() 
P.map(compute_function, A) 
print A 

輸出是:

[0, 0, 0] 
Computing 
[0, 0, 1] 
Computing 
Computing 
Computing 
[1, 1, 2] 
Computing 
Computing 
Computing 
[1, 1, 2] 

但我希望得到的最後一行讀[2, 2, 3]。顯然,compute被調用,但最終的對象被扔掉了。我如何「保持國家」?

回答

1

你不行。酸洗不允許您將狀態更改發送回酸洗對象。你可以做最簡單的事情是:

def compute_function(x): 
    x.compute() 
    return x 

A = [state() for _ in xrange(3)] 
A = P.map(compute_function, A) 

您也可以使用multiprocessing.Manager其創建對象,並把它放在一個單獨的進程和其他進程提供代理的替代品。但請注意,這意味着任何通過代理對象的操作都會在進程之間進行通信,這是緩慢

相關問題