- 实现一个基于入度的拓扑排序方法,最小堆
- 实现一个就绪队列ReadyQueue,用于将入度为0放入其中
- 实现线程池
- 从 ReadyQueue 取出一个 node id交给线程池执行: node.process()、执行完成时通知其所有下游节点 indeg–-、如果 indeg=0 则将其入队 ReadyQueue
- 主线程等待所有任务执行完成
- graph添加add_node方法,支持指定新node的前序依赖和后续依赖
- 创建一个新文件,主要实现json处理类完成引擎dag可配置化,支持将node、dag、strategy配置等配置为json,通过解析json文件完成graph的初始化。
- 模拟请求走单策略单图。
- DAG拓扑结构共享
- 全局缓存所有 JSON 配置的 DAG 拓扑,避免重复解析。
- 每个请求只拷贝 indeg + ReadyQueue + 调度上下文。
- 每个请求的ReqContext独立调度上下文,实现并发执行dag
- 新增一个ReqContext.h,实现ReqContext类,每个请求维护一个ReqContext,内部维护自己的调度器DAGScheduler,从而能多请求并行执行单DAG实例。
- 保证indeg的修改请求间互不影响。
- 主线程不断接受请求,创建ReqContext,使用ReqContext中的DAGScheduler调度执行。每个请求的调度策略按照第三步实现的单请求单策略执行。
- TaskManager池化调度器
- 为了性能,考虑实现复用调度器对象,而不是每个请求都new/delete。
- 实现TaskManagerPool类,请求进来时从TaskManager池里取一个调度器对象(调度上下文 + indeg 副本),执行后重置并归还。
1.调度策略可插拔
- DAGScheduler不直接依赖FIFO,就绪队列是接口化的 IReadyQueue。
- 可以配置 Priority、Deadline、Weighted round robin 等不同调度策略。
- 异步日志
-
DAG配置
-
算子开发
-
引擎参数
g++ main.cpp -std=c++20 -o a
./a