2013-10-31 11 views
9

Kosztowało mnie to całą noc, aby debugować mój kod, iw końcu znalazłem ten podchwytliwy problem. Proszę spojrzeć na kod poniżej.Jak działa funkcja wywołania zwrotnego w wieloprocesorowym pythonie map_async

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() 

myślałem, że chciałbym dostać A=[0,0,1], ale wyjście jest A=[[0],[0,1]]. Nie ma to dla mnie sensu, ponieważ jeśli mam A=[], A.extend([0]) i A.extend([0,1]), otrzymam A=[0,0,1]. Prawdopodobnie callback działa w inny sposób. Więc moje pytanie brzmi, jak uzyskać A=[0,0,1] zamiast [[0],[0,1]]? Z góry dziękuję za wszelkie uwagi.

+0

Jakiego systemu operacyjnego i wersji Pythona używasz? –

Odpowiedz

20

Oddzwonienie jest wywoływane raz z wynikiem ([[0], [0, 1]]), jeśli używasz map_async.

>>> 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]] 

Zastosowanie apply_async jeśli chcesz być nazywany callback dla każdego czasu.

+1

Ten kod nie powinien działać, musisz umieścić go pod 'if __name__ == '__main __'' statement –

+7

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

+1

Och! Przepraszam. Masz szczęście faceci z Mac/Linuksa: P –

Powiązane problemy