如何使用concurrent.futures.ThreadPoolExecutor保持函数返回值顺序?
按提交顺序获取线程池执行结果的解决方案
直接遍历你已经按顺序保存的futures列表,逐个调用result()方法即可,这样就能严格遵循self.seq里的函数提交顺序来收集结果。
修改后的代码如下:
with concurrent.futures.ThreadPoolExecutor() as executor: length = len(self.seq) futures = [None] * length results = [] for i in range(length): f, args, kwargs = self.seq[i] future = executor.submit(f, *args, **kwargs) futures[i] = future # 直接按提交顺序遍历futures,逐个获取结果 for future in futures: results.append(future.result())
原理说明
- 你之前的
futures列表已经严格按照self.seq的顺序存储了每个任务的Future对象 - 遍历
futures列表并调用result(),会依次等待对应任务完成(如果还没完成的话),然后把结果按顺序加入results - 这种方式完全不需要用
as_completed(),天然保留原函数列表的提交顺序
内容的提问来源于stack exchange,提问作者Phillip Feldman
相关产品推荐
相关产品推荐

