Session deadlocks (never completes, no error) when an `If` node’s branch input comes from a chain containing an `Iterate` node

该死锁发生在 InvokeAI 工作流中,当 If 节点的分支输入( true_input / false_input )来自包含 Iterate 节点的上游链时,会话会永久卡住且不报错。优先排查是否在 If 分支输入路径中混用了 Iterate 节点。

快速结论:该死锁发生在 InvokeAI 工作流中,当 If 节点的分支输入(true_input/false_input)来自包含 Iterate 节点的上游链时,会话会永久卡住且不报错。优先排查是否在 If 分支输入路径中混用了 Iterate 节点。

适用环境:InvokeAI(已确认可复现的提交为 a21d74b8bd 及其 PR 头);Issue 未提供具体的操作系统、Python、CUDA 或显卡版本。

最快修复方案:暂无确认的一步修复方案。Issue 已标记为已修复,但未在讨论中给出具体的修复补丁或版本号,建议升级到包含该修复的最新版本。

注意事项:该问题与 PR #9483 无关,在基础提交和 PR 头上均可独立复现。在修复版本发布前,应避免在 If 节点的分支输入链中使用 Iterate

问题场景

用户在 InvokeAI 的 workflow editor 中构建了“条件使用一批结果”的工作流:src → iterate → body → collect ──true_input──→ if,同时 cond ──condition──→ if。当会话运行时,next() 返回 Noneis_complete()Falsehas_error()False,队列项永久卡住,没有任何节点被继续执行。

报错原文

Session deadlocks (never completes, no error) when an `If` node's branch input comes from a chain containing an `Iterate` node

is_complete: False
has_error:  False
next():     None
  src: ['pending']
  iter: never prepared
  body: never prepared
  collect: never prepared
  cond: ['executed']
  if_node: never prepared

原因分析

根因在 _IfBranchScheduler.get_branch_exclusive_sources()_ExecutionMaterializer.prepare() 的交互逻辑中:

  • _IfBranchScheduler 会把 If 节点的每个分支输入展开为所有上游祖先节点,并将这些节点标记为“在 If 解析前暂缓执行”(is_deferred_by_unresolved_if)。在本例中,这个集合为 {collect, body, iter, src}
  • 没有 Iterate 时,整条链可以在一次 prepare() 中物化,If 解析后暂缓状态解除,流程正常。
  • 但链中包含 Iterate 时,prepare() 会拒绝物化迭代器,直到它的所有输入源都已执行完毕。由于上游节点都被标记为暂缓,形成了循环等待,导致死锁。

环境排查

  • 确认 InvokeAI 版本是否包含该修复(Issue 于 2026-08-24 关闭,但未列出具体修复版本号)。
  • 检查工作流中是否存在 If 节点的 true_input/false_input 来自包含 Iterate 的链路。
  • 可尝试用 PYTHONPATH=. 从仓库根目录运行 Issue 中提供的复现脚本来验证环境。

解决步骤

  1. 升级 InvokeAI 到包含此修复的最新版本,或拉取 main 分支的最新代码重新构建。
  2. 如果无法立即升级,可优先尝试调整工作流结构:将 Iterate 的结果先通过 Collect 收集后,再额外用一个中间节点(如 Pass 或自定义节点)绕过 If 分支输入的直接依赖链。
  3. 如果问题仍然存在,请确认工作流中 If 节点的 condition 输入是否已提前执行完毕(如 Issue 示例中的 cond 节点状态为 executed)。
  4. 检查是否存在其他包含 Iterate 且需要被 If 分支引用的场景,尝试将 Iterate 移出分支输入链。

验证方法

重新运行问题中的复现脚本或相同结构的工作流,确认 next() 返回非 None 值,is_complete() 最终为 True,并且 src → iter → body → collect → if_node 所有节点均被执行。if_node 应正确选择收集到的列表。

参考来源

invoke-ai/InvokeAI #9484

GamsGo AI

AI 工具推荐

想把多个 AI 模型放在一个入口?

GamsGo AI 集成 ChatGPT、DeepSeek、Gemini、Claude、Midjourney、Veo 等常用模型,适合写作、绘图、视频和日常 AI 工作流。

了解 GamsGo AI

推广链接:通过此链接购买,我可能获得佣金,不影响你的价格。

这个方案解决了吗?

celebrityanime
celebrityanime
文章: 20304

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注