如何获取ThreadPoolExecutor中executor.map的任务返回值?
如何获取
executor.map的返回结果 嘿,我来帮你搞定这个问题!你遇到的核心点是对executor.map()的返回值理解有点偏差——它返回的不是现成的列表,而是一个惰性迭代器,只有当你去遍历它(比如转成列表)的时候,才能拿到所有func的返回结果。另外你的代码里还有几个小语法问题,我一起帮你修正并说明。
首先,先修正代码里的语法错误
你的代码里有几处小问题需要调整:
def paralel_func(alist,blist)后面缺少冒号:ThreadPoolExecutor需要从concurrent.futures模块导入才能使用- 另外
func里的func3(3)看起来像是笔误,应该是func3(b)吧?不然每个任务都固定传3就没意义了😉
正确获取返回结果的方法
executor.map()会返回一个迭代器,它会按输入序列的顺序,依次返回每个func调用的结果。你只需要把这个迭代器转换成列表,就能一次性拿到所有结果了。
下面是完整的可运行代码示例:
from concurrent.futures import ThreadPoolExecutor # 先定义依赖的func2和func3(假设你之前有这两个函数,这里给个示例实现) def func2(x): return x * 2 def func3(y): return y + 5 def func(a, b): # 修正笔误,把func3(3)改成func3(b) return (func2(a), func3(b)) def paralel_func(alist, blist): with ThreadPoolExecutor(max_workers=None) as executor: # 把map返回的迭代器转成列表,即可获取所有结果 results = list(executor.map(func, alist, blist)) return results # 测试调用 if __name__ == "__main__": alist = [1, 2, 3] blist = [4, 5, 6] output = paralel_func(alist, blist) print(output) # 输出:[(2, 9), (4, 10), (6, 11)]
为什么之前没拿到结果?
因为迭代器是惰性求值的——它不会立刻执行所有任务并存储结果,只有当你主动去遍历它(比如用list()转换、用for循环迭代)的时候,才会逐个取出每个任务的返回值。如果只是调用executor.map()但不处理返回的迭代器,虽然with块会等待所有线程完成任务,但你没法拿到结果。
额外小提示
如果你的任务可能抛出异常,迭代器在遍历到抛出异常的任务时会直接抛出异常,这时候可以用concurrent.futures.as_completed()来更灵活地处理;不过如果你的任务都是稳定的,用map()转列表就足够啦。
内容的提问来源于stack exchange,提问作者zython
相关产品推荐
相关产品推荐

