[Bug] 个股资金流 capital_flow 取数「挂死」而非「慢」:放大超时无效,duration_ms 恒等于超时值

Author: YHQS1997Created Sep 24, 2026Updated Sep 24, 2026

环境

项 值
软件版本 v3.32.0(桌面版 Electron,构建 2026-09-06)
系统 Windows 11 x64
配置 FUNDAMENTAL_STAGE_TIMEOUT_SECONDS=45 / FUNDAMENTAL_FETCH_TIMEOUT_SECONDS=15 / ENABLE_EASTMONEY_PATCH=true

现象

capital_flow(个股资金流)在每次分析中 100% 失败,与网络状况无关:

json
"capital_flow": {
  "status": "failed",
  "errors": ["capital_flow timeout"],
  "source_chain": [{"provider": "fundamental_pipeline",
                    "result": "failed",
                    "duration_ms": 45000}]
}

关键证据:这是「挂死」,不是「预算不够」

判断依据:source_chain.duration_ms 与所设超时值的对照。

实验轮 FETCH 超时设定 实测 duration_ms 分析总耗时
第一轮 15s 45000(stage 45s 到点被杀) ~90s
第二轮 45s 仍然 45000 4 分钟以上

第二轮把 FETCH 超时从 15s 放大到 45s,duration_ms 纹丝不动地等于 stage 的 45 秒—— 说明资金流取数在 stage 预算内阻塞到 stage 超时被整体杀掉,放大 FETCH 超时零收益, 反而让每次分析白白多等一分钟以上。已回退到 45/15。

判据(供排查参考):

  • duration_ms ≈ 所设超时值 → 挂死(阻塞到超时被杀),放大超时无用
  • duration_ms < 所设超时值 但仍失败 → 真预算不足,放大超时才有意义

补充

  • 同一时段、同一配置下,earnings / dragon_tiger / boards 均可成功(ENABLE_EASTMONEY_PATCH=true + 45/15/2), 说明网络与东财限流不是本项的主因。
  • 与 #2247(妙想 MX_API 补充筹码分布/个股资金流数据源)提到的问题方向一致,供交叉参考。

已排除「配置没拉满」的可能

提交前已对照上游 main 分支的 .env.example(334 个配置项)逐项核对:

  • 上游模板中不存在任何与「个股资金流 / capital flow」相关的配置项或数据源开关; 唯一的数据源优先级配置组(EFINANCE_PRIORITY / AKSHARE_PRIORITY / TUSHARE_PRIORITY …) 模板注释明确写了「仅控制普通 A 股日 K 通用链路」,不作用于基本面聚合链路。

  • 相关配置当前值均已高于上游默认值:

    配置 上游默认 本例值
    FUNDAMENTAL_STAGE_TIMEOUT_SECONDS 8.0 45.0
    FUNDAMENTAL_FETCH_TIMEOUT_SECONDS 8.0 15.0
    FUNDAMENTAL_RETRY_MAX 1 2
    ENABLE_EASTMONEY_PATCH false true
  • 同一次分析中 earnings / dragon_tiger / boards 已能成功,说明并非全局网络或限流问题。

建议修复方向

  1. 排查 fundamental_pipeline 中资金流取数是否存在无内部超时的同步阻塞调用(如 requests 未设 timeout、 或在事件循环里同步等待)。
  2. 若短期难修,建议给资金流单项加独立子超时,避免它拖死整个 fundamental stage。
  3. 文档中给出 duration_ms 判据,帮助用户区分「慢」与「挂死」。

本 issue 由用户实际排障整理,数据取自 analysis_history.context_snapshot 的结构化字段,非日志猜测。

Source: ZhuLinsen/daily_stock_analysis