并发与同步:扇出、汇合、竞态与部分失败
前置知识
一句话定义
并发编排把一个任务扇出(Fan-out)给多个智能体同时执行,再在汇合点(Fan-in)按选定策略收拢结果;工程难点不在「同时跑」,而在共享状态的写入竞态、汇合策略的选择与部分失败的处置。
直观类比
餐厅出餐:一道菜拆给三个厨师同时做(扇出),传菜口规定「三个都好了才上桌」(汇合:all)还是「有一个像样就上」(first);如果三个厨师同时往同一张订单上划勾,字迹会叠成一团(竞态)——所以规定各写各的联(reducer)。
为什么重要
kp-004 已证明并行的延迟收益由关键路径决定,但只有把扇出/汇合做对,理论收益才能兑现;而共享 State 的并发写是 LLM 框架中最隐蔽的 bug 源——不报错、偶发、难复现,直接污染下游。群体模式(kp-009)的可用性完全建立在本知识点的工程正确性上。
前置知识
kp-017(State 与 reducer 约定——竞态治理的静态基础);kp-004(并行延迟模型)。
核心概念
- 扇出(Fan-out):一个节点触发多个并行分支(框架内以映射/Send 机制实现动态数量);
- 汇合(Fan-in / Join):等待并收拢分支结果,四种策略——all(全到齐)、all-successful(成功者到齐)、first(首个可用)、quorum(k)(k 个即走);
- 竞态(Race Condition):两个分支同时写同一 State 字段,后写覆盖先写;
- Reducer(归并器):字段级声明的合并函数(追加、取并集、自定义),把「同时写」变为「可合并写」;
- 部分失败(Partial Failure):部分分支失败时的取消/降级/重试决策。
原理与机制
竞态治理三层:(1) 结构层——字段所有权(kp-013):每个 State 字段声明唯一写入者,结构性消除大部分冲突;(2) 合并层——为多写者字段配 reducer:消息列表用 append,布尔标志用 or,评分用 max;LangGraph 的 State 声明原生支持;(3) 临界区层——真正的读-改-写序列(如「计数器 +1 后判断阈值」)需要串行化:汇合节点统一处理或外部锁。延迟核算:端到端 = max(分支延迟) + 汇合开销(kp-004 模型三),因此分支要均衡——把慢分支再拆分或提前启动,避免「最长尾」决定全局。部分失败决策表:结果可互补(多源检索)→ all-successful 降级接受;结果需互证(法定人数)→ quorum(k) 判断是否达到决策底线;任一成功即可(缓存回源)→ first + 取消其余(注意取消要传播到分支内部,防「僵尸分支」继续烧 token);全部失败 → 进入降级路径(kp-022)而非静默返回空。与检查点的配合:并行分支的检查点在汇合后统一落盘,避免半完成状态被持久化。
图示
┌──▶ [分支A: 检索网] ──┐
查询 ──▶ [扇出] ┼──▶ [分支B: 查库] ──┼──▶ [汇合: all-successful + reducer(append)] ──▶ 下游
└──▶ [分支C: 问专家] ──┘ ▲
分支C超时失败 │
处置: 降级接受 A+B (可互补任务) / 或 quorum(2) 未达 → 走降级路径
写入规约: findings 字段 reducer=append, 每分支只追加自己的命名空间实例或案例
kp-009 的五路投票的落地:扇出用框架的并行分支(各分支独立温度与提示),分支只把「候选答案 + 置信度」追加进各自的 State 命名空间(reducer = append,无竞态);汇合节点执行 quorum(3) 判定,两个慢分支超时被取消(cancel 传播),达到 4/5 一致即输出;若仅 2/5 一致,转入 kp-022 的降级路径(缩小问题重问或转人工)。
公式或模型
端到端延迟 T = max(t₁…tₙ) + t_join;分支数 n 的性价比拐点在「边际分支的延迟改善 < 汇合与 token 边际成本」处,工程上以实测分位数(P95 而非均值)代入计算,因为 max 由尾部决定。
常见误区
- 误区一:并行 = 快。 分支长尾失衡时 max(t) 可能比串行还慢;先看 P95 再谈并行收益;
- 误区二:并发写靠「小心一点」避免。 偶发竞态无法靠纪律根除,必须结构层(所有权)+ 合并层(reducer)双保险;
- 误区三:失败分支静默吞掉。 不显式处置的部分失败会让「少了一路证据」的结论伪装成正常结果。
与其他知识点的关系
reducer 约定源自 kp-017 的 State 设计;汇合策略是 kp-009 聚合策略的工程底座;部分失败的降级路径在 kp-022 展开;并行分支的超时与取消是 kp-020 资源失控的第一道闸。
自测题
- 四种汇合策略各适配什么场景?
要点:all——分支强互依;all-successful——结果可互补;first——任一可用即可(需传播取消);quorum(k)——需多数互证的决策。
- 竞态治理三层的顺序与各自手段?
要点:字段所有权(结构消除)→ reducer(可合并写)→ 串行化临界区(读改写序列)。
- 为什么端到端延迟要看 P95 而不是均值?
要点:并行总延迟由 max 决定,max 由尾部分支决定;均值会系统性低估。
延伸阅读
LangGraph 文档的并行分支与 Send 机制展示了动态扇出的 API 形态;分支取消传播的实现细节各框架不同,落地前务必实测。