マルチプロセス map_async でコールバック関数はどのように機能しますか? 質問する

マルチプロセス 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 を使用する場合、結果 ( ) とともにコールバックが 1 回呼び出されます。

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

おすすめ記事