2013-10-31 4 views
9

코드를 디버깅하는 데 밤새도록 비용이 들었습니다. 결국이 까다로운 문제를 발견했습니다. 아래 코드를 살펴보십시오. 파이썬 멀티 프로세싱에서 콜백 함수는 어떻게 작동합니까?

from multiprocessing import Pool 

def myfunc(x): 
    return [i for i in range(x)] 

pool=Pool() 

A=[] 
r = pool.map_async(myfunc, (1,2), callback=A.extend) 
r.wait() 

은 내가 A=[0,0,1]을 얻을 것이라고 생각하지만, 출력은 A=[[0],[0,1]]입니다. 내가 A=[]을 가지고 있다면, A.extend([0])A.extend([0,1])이 나를 A=[0,0,1]으로 줄 것이기 때문에 이것은 나에게 의미가 없습니다. 아마도 콜백은 다른 방식으로 작동합니다. 그래서 내 질문은 [[0],[0,1]] 대신 A=[0,0,1]을 얻는 방법입니까? 모든 의견을 미리 보내 주셔서 감사합니다.

+0

사용중인 운영 체제 및 Python 버전은 무엇입니까? –

답변

20

map_async를 사용하면 콜백이 한 번 호출되어 결과 ([[0], [0, 1]])가됩니다.

>>> from multiprocessing import Pool 
>>> def myfunc(x): 
...  return [i for i in range(x)] 
... 
>>> A = [] 
>>> def mycallback(x): 
...  print('mycallback is called with {}'.format(x)) 
...  A.extend(x) 
... 
>>> pool=Pool() 
>>> r = pool.map_async(myfunc, (1,2), callback=mycallback) 
>>> r.wait() 
mycallback is called with [[0], [0, 1]] 
>>> print(A) 
[[0], [0, 1]] 

사용 apply_async 당신이 콜백 원하는 경우 각 시간이라고합니다.

pool=Pool() 
results = [] 
for x in (1,2): 
    r = pool.apply_async(myfunc, (x,), callback=mycallback) 
    results.append(r) 
for r in results: 
    r.wait() 
+1

이 코드는 작동하지 않아야합니다. 'if __name__ =='__main __ ''문 –

+7

@GamesBrainiac, [(Windows의 경우)] (http://docs.python.org/2/library/multiprocessing .html # windows). – falsetru

+1

오! 미안하지만. 당신 행운의 맥/리눅스들 : P –

관련 문제