¿Cómo funciona la función de callback en multiproceso python map_async

Me costó toda una noche depurar mi código, y finalmente encontré este problema complicado. Por favor, eche un vistazo al código de abajo.

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

Pensé que obtendría A=[0,0,1] , pero la salida es A=[[0],[0,1]] . Esto no tiene sentido para mí porque si tengo A=[] , A.extend([0]) y A.extend([0,1]) me darán A=[0,0,1] . Probablemente la callback funciona de una manera diferente. ¿Entonces mi pregunta es cómo obtener A=[0,0,1] lugar de [[0],[0,1]] ? Gracias de antemano por cualquier comentario.

La callback se llama una vez con el resultado ( [[0], [0, 1]] ) si usas 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]] 

Use apply_async si desea que se llame a la callback cada vez.

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