Pregel 执行引擎详解
Pregel 类实现 BSP:准备任务 → 并行执行节点 → 应用 channel 更新 → 写 checkpoint → 下一超步,直到无任务或达到 recursion_limit。
1. 执行循环(概念)
mermaid
flowchart LR
A[取待执行节点集] --> B[并行 runNode]
B --> C[收集 writes]
C --> D[apply 到 Channels]
D --> E[checkpoint?]
E --> F{还有任务?}
F -->|是| A
F -->|否| 结束2. 核心组件
| 组件 | 职责 |
|---|---|
| Pregel | 编译后可执行图对象 |
| PregelLoop | 超步主循环、调度 |
| PregelRunner | 并发跑节点任务 |
| ChannelWrite | 把节点输出转为 channel 更新 |
3. 任务从哪来
- 入口:
START或显式 input 写入 channel。 - 后续:上一超步写 channel 后,根据 边 + 订阅 计算
PULL到的节点。 - Send / Command:动态派生子任务(map-reduce 式扇出)。
- 条件边:读 state 决定下一节点集合。
4. 节点执行
节点函数签名(概念):接收 state 快照、config(含 thread、run_id),返回 partial state 或 Command(goto、resume、update)。
异常:可配置中断图或按策略重试(见版本文档)。
5. 并发与确定性
同超步内多节点可 并行;步末合并保证确定性取决于 reducer 是否可交换。
需要严格顺序时用单节点或 chain 边,勿同超步写冲突字段。
6. 缓存与 interrupt
- 部分版本支持 cache policy 跳过重复 LLM 调用(依配置)。
- interrupt() 在节点内抛出特殊控制流 → 保存 checkpoint → 暂停;resume 带用户输入继续(见 07)。
7. recursion_limit
防止环图死循环;超步计数超限抛错。设计图时保证有条件出口。
8. 总结
Pregel = LangGraph 的心脏;Graph 层只是生成配置好的 Pregel 实例。调试「为何没跑到某节点」:查本超步 channel 更新与边条件。