コードをデバッグするのに一晩かかりましたが、ついにこのトリッキーな問題を見つけました。以下のコードをご覧ください。
_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]]
_を取得する方法ですか?
コールバックは、結果([[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()