как работает функция обратного вызова в 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()