2013-10-31 34 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]。回调可能以不同的方式工作。所以我的问题是如何获得A=[0,0,1]而不是[[0],[0,1]]?提前感谢您的任何意见。

+0

您使用的是什么操作系统和python版本? –

回答

20

如果使用map_async,则回调将被调用一次,结果为([[0], [0, 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#窗口)。 – falsetru

+1

哦!那不好意思了。你幸运的Mac/Linux家伙:P –