请求状态对象与运行时抽象边界#
这章解决什么问题#
很多系统在“模块分层”讲完之后,读者仍然会有一种模糊感:虽然知道有哪些目录和组件,但不知道贯穿这些层的核心对象到底有哪些。在 SGLang 里,这种模糊特别容易出现在 ReqState、ScheduleBatch、ForwardBatch、RequestStage 这些对象周围,因为它们分别站在请求状态、批次状态、执行状态和观测状态上。
这一章的目标,就是把这些对象放在一起看。这样做不是为了列术语,而是为了让读者看到:不同章节虽然各自关注不同问题,但它们实际都是围绕一组核心抽象在展开。
为什么要抓“对象”而不是只抓“模块”#
模块告诉你“代码放在哪”;抽象对象告诉你“状态怎样流动”。如果只抓模块,你会知道 tokenizer_manager.py、scheduler.py、forward_batch_info.py 都很重要;但如果不抓对象,你还是很难说清它们之间到底传递了什么。
优秀技术书之所以喜欢反复回到几个关键抽象,就是因为它们比目录更稳定。目录会变,文件会拆,但“请求状态”“批次状态”“前向状态”“观测切片”这几类抽象往往会长期存在。把这一层抓稳,整本书的复用价值也会更高。
ReqState:请求视角的连续性#
从 TokenizerManager 一侧看,ReqState 更像调用方视角的状态容器。它帮助系统记住一条请求的流式结果、finish 情况、文本缓冲和其他与“这条请求现在处于什么状态”相关的信息。因此它更接近 request lifecycle,而不是底层执行。
这也是为什么 ReqState 很适合拿来当全书的第一组核心抽象。只要你还在从“单条请求”角度理解系统,它几乎都会出现。
ScheduleBatch:调度视角的中间层对象#
当请求进入 scheduler 之后,单条请求已经不再是 runtime 的唯一视角。系统开始更关心“当前批次怎样被组织、下一轮如何推进、哪些请求能一起进入 prefill / decode”。ScheduleBatch 正是调度层用来管理这些问题的中间层对象。
你可以把它理解成“调度器真正思考问题时使用的形状”。它比 request 更高层,又比 ForwardBatch 更贴近策略层。也正因为这样,ScheduleBatch 是调度章节的关键抽象,而不是 execution 章节的附属名词。
ForwardBatch:执行视角的最低层状态#
一旦进入 execution model,真正承载前向运行的是 ForwardBatch。相比 ScheduleBatch,它更接近低层 tensor 状态和 ForwardMode。如果说 ScheduleBatch 回答的是“这轮想跑什么”,那么 ForwardBatch 回答的就是“这一轮已经准备好怎样跑了”。
这正是 execution model 章节一定要单独讲 ForwardBatch 的原因。因为从这一层开始,系统已经不再主要关心请求叙事,而开始关心执行模式、logits 和 sampling。
RequestStage:把运行时行为外显出来#
RequestStage 站在另一条轴上。它不是请求对象、也不是 batch 对象,而是观测对象。它把 TOKENIZE、REQUEST_PROCESS、PREFILL_FORWARD、DECODE_LOOP 等阶段抽成了可见标签,让系统的内部行为能够被 trace 和 metrics 消费。
从技术书角度看,这一点特别重要。因为它说明 observability 并不是“后面补的运营能力”,而是在运行时抽象层面已经有自己的第一性对象。
一个抽象层映射图#
flowchart LR
A["ReqState\n请求视角"] --> B["ScheduleBatch\n调度视角"]
B --> C["ForwardBatch\n执行视角"]
A -. stage annotation .-> D["RequestStage\n观测视角"]
B -. stage annotation .-> D
C -. stage annotation .-> D这张图的用途,是把“同一系统里的不同对象”压到一张抽象图上。相对于模块图,它多解释了一个非常关键的事实:整本书虽然分章讲不同问题,但底层其实在围绕同几组对象反复转译。
本章对应哪些代码路径#
这一章最重要的锚点包括 python/sglang/srt/managers/tokenizer_manager.py、python/sglang/srt/managers/schedule_batch.py、python/sglang/srt/model_executor/forward_batch_info.py 与 python/sglang/srt/observability/req_time_stats.py。如果要继续追抽象如何落回调用链,这几条路径就是最稳的起点。
小结#
模块帮助你定位代码,抽象帮助你真正理解系统。这一章的价值,就是把整本书前后章节都在围绕什么对象展开这件事说清楚。只要这组抽象稳定下来,后面的细节就不再是散的。
叶王 © 2013-2026 版权所有。如果本文档对你有所帮助,可以请作者喝饮料。