Python 回调函数如何在多处理映射异步中工作?

Python 回调函数如何在多处理映射异步中工作?,python,multiprocessing,pool,Python,Multiprocessing,Pool,调试代码花了我整整一个晚上,我终于发现了这个棘手的问题。请看下面的代码 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]]。这对我来说没有意义,因为如果我

调试代码花了我整整一个晚上,我终于发现了这个棘手的问题。请看下面的代码

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]]

如果使用map\u 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]]
如果希望每次调用回调,请使用

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

您使用的是什么操作系统和python版本?此代码不应该工作,如果statement@GamesBrainiac哦对不起。你们这些幸运的mac/linux家伙:P@falsetru,它起作用了。非常感谢。现在我看到了apply_async和map_async之间的另一个区别。如果在Windows和其他操作系统中使用
if uuuuuu name_uuuu=='\uuuu main_uuu'
将使其工作,因此我建议始终这样做以提高可移植性。