You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

线程脚本疑似竞态条件问题:结果列表缺失数据求助

问题分析与解决方案

核心问题:重复调用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.03 20:45:01