python multiprocessing pool

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



multiprocessing pool (1)

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 devolución de llamada 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 devolución de llamada 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 devolución de llamada 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()