2013-10-31 19 views
9

Mi è costato un'intera notte per eseguire il debug del mio codice e alla fine ho trovato questo delicato problema. Si prega di dare un'occhiata al codice qui sotto.come funziona la funzione di callback in python multiprocessing 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() 

ho pensato che avrei avuto A=[0,0,1], ma l'uscita è A=[[0],[0,1]]. Questo non ha senso per me, perché se ho A=[], A.extend([0]) e A.extend([0,1]) mi darò A=[0,0,1]. Probabilmente la callback funziona in un modo diverso. Quindi la mia domanda è come ottenere A=[0,0,1] anziché [[0],[0,1]]? Grazie in anticipo per eventuali commenti.

+0

Quale sistema operativo e versione Python stai usando? –

risposta

20

La chiamata viene richiamata una volta con il risultato ([[0], [0, 1]]) se si utilizza 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]] 

Usa apply_async se si vuole di callback per essere chiamato per ogni volta.

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

Questo codice non dovrebbe funzionare, devi metterlo sotto una 'if __name__ == '__main __'' istruzione –

+7

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

+1

Oh! Scusa allora. Ragazzi fortunati Mac/Linux: P –

Problemi correlati