2013-04-26 6 views
1

다음은 파일을 읽고 각 행을 추가하는 샘플 코드입니다. 0-20의 모든 숫자를 합산 한 것입니다. 그러나 나는 항상 0의 결과를 얻습니다.파이썬 다중 처리에서 클래스를 사용하는 방법은 무엇입니까?

중간 계산이 성공한 것을 볼 수 있습니다. 왜 최종 결과는 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

당신은 subprocess.Valueshared memory를 사용하여이 작업을 수행 할 수, 바로 다음에 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) 
관련 문제