как работает функция обратного вызова в 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()
Я думал, что получу A=[0,0,1]
, но выход A=[[0],[0,1]]
. Это не имеет смысла для меня, потому что если я A=[]
, A.extend([0])
и A.extend([0,1])
даст мне A=[0,0,1]
. Возможно, обратный вызов работает по-другому. Поэтому мой вопрос в том, как получить A=[0,0,1]
вместо [[0],[0,1]]
? Заранее спасибо за любые комментарии.
1 ответов
обратный вызов вызывается один раз с результатом ([[0], [0, 1]]
) Если вы используете 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]]
использовать apply_async
если вы хотите, чтобы обратный вызов вызывался каждый раз.
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()