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