2013-04-26 43 views
1

下面是一些示例代碼,它讀取一個文件並將每行加起來。它應該將0-20的所有數字相加。但是,我總是得到0的結果。如何在Python多處理中使用類?

我可以看到中間計算成功,爲什麼最終結果0

有沒有更好的方法來做到這一點?我正在嘗試對更大,更復雜的輸入文件進行更多的計算,並隨時存儲一些統計數據。

import multiprocessing 
import StringIO 

class Total(): 
    def __init__(self): 
     self.total = 0 

    def add(self, number): 
     self.total += int(number) 

    def __str__(self): 
     return str(self.total) 

total = Total() 

def f(input): 
    total.add(input) 

# Create mock file 
mock_file = StringIO.StringIO() 
for i in range(20): 
    mock_file.write("{}\n".format(i)) 
mock_file.seek(0) 

# Compute 
pool = multiprocessing.Pool(processes=4) 
pool.map(f, mock_file) 

print total 

# Cleanup 
mock_file.close() 

回答

2

每個子叫f更新自己的total副本,因此主進程的total不受影響。

您可以讓每個子進程返回其計算結果(在您的模擬示例中,這只是輸入,保持不變),然後將其累積到主進程中。例如: -

def f(input): 
    return input 

results = pool.map(f, mock_file) 
for res in results: 
    total.add(res) 
3

可以使用shared memorysubprocess.Value做到這一點,只是改變你的Total類以下幾點:

class Total(): 
    def __init__(self): 
     self.total = multiprocessing.Value('d', 0) 

    def add(self, number): 
     self.total.value += int(number) 

    def __str__(self): 
     return str(self.total.value) 
相關問題