解析器卡死看游标是否推进
一次实例
流式 Markdown 解析器死循环:
模型流式输出列表
→ 某一帧内容刚好停在 "- " / "1. " / "# "
→ 列表解析器认为内容不完整(要求标记后必须已有内容)
→ 段落解析器又拒绝把它当普通文本(拒绝列表前缀)
→ 解析游标 index 没有前进
→ while 永久空转 → 浏览器 renderer 100% CPU
→ 后续 SSE terminal 无法处理 → 页面一直显示停止按钮
所以它表现得"偶发":只有 React 刷新恰好撞上未完成的 Markdown 标记才触发。最小探针证实 "- " / "1. " / "# " 永久不返回,而完整的 "- item" 正常返回。
可迁移的判断
- 偶发 + CPU 高 + 后续事件全部不处理 = 同步循环卡住,不是网络问题。后续事件收不到处理,是因为主线程被占满。
- 增量解析器必须保证每条分支都推进游标:要么消费至少一个字符,要么明确
break。多个解析器互相推诿("这不该我处理")时,兜底分支必须存在。 - 流式输入会在任意字符处截断,解析器必须能处理半截标记(
"- "后面还没内容)。
相关
- 高频手势缩放不要走React状态 —— 同一族:主线程被同步计算占满
- 流式更新要合并字段而非替换对象 —— 流式链路上的另一处状态处理
- 零延迟零尝试说明请求没发出去 —— 同为"看起来卡住"的不同层根因
- 全绿的单测可能测的不是那条链路
- 终态已到达后补写不能覆盖它