解析器卡死看游标是否推进

**流式渲染偶发"卡死"、CPU 打满,先怀疑解析循环有没有推进游标,而不是后端或模型。典型形态:某条分支既不消费输入也不前进 index,`while` 空转。**

一次实例

流式 Markdown 解析器死循环:

模型流式输出列表
→ 某一帧内容刚好停在 "- " / "1. " / "# "
→ 列表解析器认为内容不完整(要求标记后必须已有内容)
→ 段落解析器又拒绝把它当普通文本(拒绝列表前缀)
→ 解析游标 index 没有前进
→ while 永久空转 → 浏览器 renderer 100% CPU
→ 后续 SSE terminal 无法处理 → 页面一直显示停止按钮

所以它表现得"偶发":只有 React 刷新恰好撞上未完成的 Markdown 标记才触发。最小探针证实 "- " / "1. " / "# " 永久不返回,而完整的 "- item" 正常返回。

可迁移的判断

  • 偶发 + CPU 高 + 后续事件全部不处理 = 同步循环卡住,不是网络问题。后续事件收不到处理,是因为主线程被占满。
  • 增量解析器必须保证每条分支都推进游标:要么消费至少一个字符,要么明确 break。多个解析器互相推诿("这不该我处理")时,兜底分支必须存在。
  • 流式输入会在任意字符处截断,解析器必须能处理半截标记("- " 后面还没内容)。

相关