线程脚本疑似竞态条件问题:结果列表缺失数据求助
问题分析与解决方案
核心问题:重复调用get_results(i)导致数据不一致
你的代码中task函数里两次调用了get_results(i):
- 第一次赋值给
abcd_logging并打印,能得到预期结果 - 第二次用在列表推导式
[n for n in get_results(i)]中返回
如果get_results是消耗型迭代器(比如生成器、文件对象)或者每次调用会返回不同结果(比如依赖外部动态数据、有副作用),第二次调用就可能返回空或不完整的数据,直接导致results中缺失内容。
另外,你推测的竞态条件不成立:因为as_completed的结果处理循环是在主线程串行执行的,所有future.result()获取和results拼接操作都是单线程完成的,不存在多线程同时修改results的情况。
修复方案:只调用一次get_results(i)
修改task函数,将get_results(i)的结果只获取一次,同时用于打印和返回:
def task(i): # 仅调用一次get_results,保存结果 result_data = list(get_results(i)) print(result_data) return result_data
如果get_results本身返回的就是列表,直接用result_data = get_results(i)即可,不需要转成列表。
额外优化:提升列表拼接效率
原代码中results = results + result每次都会创建新列表,当数据量较大时效率很低,建议改用list.extend():
results = [] for future in as_completed(futures): result = future.result() results.extend(result) # 直接在原列表上扩展,避免创建新列表
内容的提问来源于stack exchange,提问作者scout14
相关产品推荐
相关产品推荐

