Skip to content

12.6 sessionRunner:多会话并发与隔离

路径docs/part12-bridge/06-session-runner.md
系列:Claude Code 完全指南 V2 · 第 12 篇


学习目标

完成本节学习后,你应该能够:

  1. 解释 sessionRunner 如何管理 多个并发 IDE↔CLI 会话 的生命周期。
  2. 描述 会话隔离:上下文、取消令牌、资源上限。
  3. 关联 BoundedUUIDSet(12.9):限制 活跃会话 id 集合防止 内存泄漏
  4. 列举 会话结束条件:显式 close、进程退出、超时闲置。

生活类比:银行窗口叫号

每个 会话一个窗口客户:柜员系统(Runner)要知道 当前叫到几号哪个窗口空闲客户走了要释放柜台

若只用一个全局计数器,A 客户B 客户业务单据会混在一起——对应 Agent 上下文串线 的严重 bug。


会话模型

对象职责
SessionId稳定关联 IDE 侧 tab/window
SessionState运行中/结束/错误
AbortController中断工具调用与流

并发策略

策略说明
会话内串行避免同上下文重入
会话间并行提高吞吐
全局上限保护文件描述符与 CPU

源码片段:会话注册(示意)

typescript
type Session = {
  id: string;
  abort: AbortController;
  createdAt: number;
  lastActiveAt: number;
};

class SessionRunner {
  private sessions = new Map<string, Session>();

  create(id: string): Session {
    if (this.sessions.has(id)) return this.sessions.get(id)!;
    const s = { id, abort: new AbortController(), createdAt: Date.now(), lastActiveAt: Date.now() };
    this.sessions.set(id, s);
    return s;
  }

  dispose(id: string) {
    const s = this.sessions.get(id);
    s?.abort.abort();
    this.sessions.delete(id);
  }
}

与 bridgeMain 集成

  1. 解码消息后读取 sessionId
  2. runner.create / get
  3. abort.signal 传入 下游 fetch / 子进程
  4. 响应后 touch(sessionId) 更新活跃时间。

闲置超时

参数作用
idleTtlMs回收长时间无消息会话
sweepIntervalMs周期扫描

通知 IDE 会话已关闭,避免 幽灵 UI


错误隔离

原则说明
会话 A 抛错不关闭 全局 Bridge
记录 sessionId日志可过滤

与 BoundedUUIDSet

活跃 sessionId 若无限增长(恶意或 bug),可用 有界集合统计最近 id,配合 LRU 淘汰策略——详见 12.9


小结

sessionRunner多窗口 IDE 工作流地基隔离取消生命周期 三角缺一不可。下一节 12.7 传输层抽象


自测

  1. 同会话并发两个 runAgent 请求会发生什么?如何选策略?
  2. abort 应传播到哪些下游?

资源表

资源每会话
临时目录可选隔离
子进程绑定 signal
打开文件ulimit 级别保护

术语

英文中文
reentrancy重入
teardown拆卸/清理

测试用例

  • 创建 1000 会话后 批量 dispose 不泄漏句柄。
  • abort无新 chunk 到达 UI。

实战题

设计 会话迁移:IDE 崩溃重启后 恢复sessionId 的风险与 新 session 策略。


伪代码:每会话队列

typescript
async function enqueue<T>(sessionId: string, job: () => Promise<T>): Promise<T> {
  return withSessionLock(sessionId, job);
}

与多 Agent

会话可包含 多个子 Agent(第 10 篇),但 Runner 不直接编排 Agent——只提供 边界与信号


监控指标

指标含义
sessions_active当前数
sessions_created_total累计
session_job_latency处理耗时

结语

会话管理是 分布式系统的微缩版:哪怕只有 本机两进程,也要 正经对待隔离

本项目仅用于教育学习目的。Claude Code 源码版权归 Anthropic, PBC 所有。