流水线架构
本文档描述流水线架构,它使用有向无环图(DAG)来编排工件生成。流水线将原始设计数据转换为用于可视化和制造的最终输出,具有依赖感知调度和高效的工件缓存。
核心概念
工件节点和依赖图
流水线使用 有向无环图(DAG) 来建模工件及其依赖关系。每个工件在图中表示为 ArtifactNode。
ArtifactNode
每个节点包含:
- ArtifactKey:由 ID 和组类型(
workpiece、step、job或view)组成的唯一标识符 - State:节点当前的生命周期状态
- Dependencies:此节点依赖的节点列表(子节点)
- Dependents:依赖此节点的节点列表(父节点)
节点状态
节点经历四种状态:
| 状态 | 描述 |
|---|---|
DIRTY | 工件需要重新生成 |
PROCESSING | 任务正在生成工件 |
VALID | 工件已就绪且是最新的 |
ERROR | 生成失败 |
当一个节点被标记为脏时,其所有依赖者也被标记为脏,将失效沿图向上传播。
PipelineGraph
PipelineGraph 从 Doc 模型构建,包含:
- 每个
(WorkPiece, Step)对的一个节点 - 每个 Step 的一个节点
- Job 的一个节点
建立依赖关系:
- Steps 依赖于其
(WorkPiece, Step)对节点 - Job 依赖于所有 Steps
DagScheduler
DagScheduler 是流水线的中央编排器。它拥有 PipelineGraph 并负责:
- 从 Doc 模型 构建图
- 识别就绪节点(DIRTY 且所有依赖项为 VALID)
- 启动任务生成工件
- 通过生成过程 跟踪状态
- 当工件就绪时 通知消费者
调度器使用生成 ID 来跟踪哪些工件属于哪个文档版本,允许跨生成重用有效工件。
关键行为:
- 构建图时,调度器将节点状态与工件管理器同步,以识别可以重用的缓存工件
- 如果前一代的工件仍然有效,可以重用
- 调度器跟踪哪些生 成 ID 有正在运行的任务,以在生成转换期间保留工件
- 即使在图重建之前也会跟踪失效,并在之后重新应用
ArtifactManager
ArtifactManager 是工件句柄的纯缓存管理器。它:
- 存储和检索工件句柄
- 管理引用计数以进行清理
- 处理生命周期(创建、保留、释放)
- 不跟踪状态(状态由 DAG 调度器管理)
共享内存生命周期
工件存储在共享内存(multiprocessing.shared_memory)中,用于工作进程和主进程之间高效的进程间通信。ArtifactStore 管理这些内存块的生命周期。
所有权模式
本地所有权: 创建进程拥有句柄并在完成后释放它。这是最简单的模式。
进程间交接: 工作进程创建工件,通过 IPC 将其发送到主进程,并转移所有权。工作进程"忘记"句柄(关闭其文件描述符而不取消链接内存),而主进程"收养"它并负责最终释放。