回调函数如何在多处理map_async中工作? [英] How does the callback function work in multiprocessing map_async?

查看:74
本文介绍了回调函数如何在多处理map_async中工作?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我花了一整夜的时间调试代码,终于找到了这个棘手的问题.请看下面的代码.

It cost me a whole night to debug my code, and I finally found this tricky problem. Please take a look at the code below.

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

I thought I would get A=[0,0,1], but the output is A=[[0],[0,1]]. This does not make sense to me because if I have A=[], A.extend([0]) and A.extend([0,1]) will give me A=[0,0,1]. Probably the callback works in a different way. So my question is how to get A=[0,0,1] instead of [[0],[0,1]]?

推荐答案

如果使用map_async,则调用一次,并返回结果([[0], [0, 1]]).

Callback is called once with the result ([[0], [0, 1]]) if you use 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 每次都会被调用.

Use apply_async if you want callback to be called for each time.

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

这篇关于回调函数如何在多处理map_async中工作?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆