Il m'a fallu une nuit entière pour déboguer mon code, et j'ai finalement trouvé ce problème délicat. Veuillez consulter le code ci-dessous.
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()
Je pensais que j'obtiendrais A=[0,0,1]
, Mais la sortie est A=[[0],[0,1]]
. Cela n'a pas de sens pour moi car si j'ai A=[]
, A.extend([0])
et A.extend([0,1])
me donnera A=[0,0,1]
. Le rappel fonctionne probablement d'une manière différente. Ma question est donc de savoir comment obtenir A=[0,0,1]
Au lieu de [[0],[0,1]]
?
Le rappel est appelé une fois avec le résultat ([[0], [0, 1]]
) si vous utilisez 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]]
Utilisation apply_async
si vous souhaitez que le rappel soit appelé à chaque fois.
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()