2013-10-31 6 views
9

私のコードをデバッグするために一晩かかるので、私はついにこのトリッキーな問題を発見した。以下のコードを見てください。どのようにコールバック関数は、Pythonのマルチプロセッシングで動作する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]を与えるので、これは私に意味をなさない。おそらくコールバックは異なる方法で動作します。だから私の質問は[[0],[0,1]]の代わりにA=[0,0,1]を得る方法ですか?ご意見ありがとうございます。

+0

使用しているオペレーティングシステムとPythonのバージョンは何ですか? –

答えて

20

map_asyncを使用すると、結果([[0], [0, 1]])でコールバックが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() 
+1

このコードはうまくいかないので、 'if __name__ == '__main __''文の下に置く必要があります。 –

+7

@GamesBrainiac、[(Windowsの場合)](http://docs.python.org/2/library/multiprocessing .html#windows)。 – falsetru

+1

ああ!申し訳ありません。あなたlucky mac/linuxの人:P –

関連する問題