FlowBuilder类是 Taskflow 框架中的一个核心组件,用于构建任务依赖图。它是 tf::Taskflow 和 tf::Subflow 的基类,提供了定义任务及其依赖关系的方法。----【基于AI】
以下是 FlowBuilder 类的详细说明:
类定义
class FlowBuilder
目的: 构建任务依赖图。
描述: 提供创建任务、定义依赖关系以及管理任务流结构的基本方法。
主要功能
1. 任务创建
- 方法: emplace
- 描述: 向任务依赖图中添加新任务。
- 功能:
- 接受一个可调用对象(如 lambda 表达式或函数指针),定义任务的执行逻辑。
- 返回一个 `tf::Task` 对象,表示新创建的任务。
- 示例:
tf::Task A = flowBuilder.emplace([]() { std::cout << "任务 A\n"; });
2. 依赖管理
- 方法: precede, succeed, broadcast, gather
- 描述: 定义任务之间的依赖关系。
- 功能:
- precede: 确保一个任务在另一个任务之前运行。
- succeed: 确保一个任务在另一个任务之后运行。
- broadcast: 将一个任务连接到多个下游任务。
- gather: 将多个上游任务连接到一个下游任务。
- 示例:
tf::Task A = flowBuilder.emplace([]() { std::cout << "A\n"; });
tf::Task B = flowBuilder.emplace([]() { std::cout << "B\n"; });
tf::Task C = flowBuilder.emplace([]() { std::cout << "C\n"; });
A.precede(B, C); // A 在 B 和 C 之前运行
B.succeed(A); // B 在 A 之后运行
3. 图结构管理
- 方法: placeholder, name, num_dependents
- 描述: 提供管理图结构的工具。
- 功能:
- placeholder: 创建一个没有关联逻辑的任务占位符,适用于动态任务创建。
- name: 为任务分配名称,便于调试或日志记录。
- num_dependents: 返回依赖于某个任务的任务数量。
- 示例:
tf::Task placeholderTask = flowBuilder.placeholder();
placeholderTask.name("占位任务");
4. 可组合性
- 方法: composed_of
- 描述: 允许将一个任务流嵌入到另一个任务流中。
- 功能:
- 支持模块化设计,通过重用现有的任务流来构建更复杂的流程。
- 适合构建分层的工作流。
- 示例:
tf::Taskflow subflow;
subflow.emplace([]() { std::cout << "子任务\n"; });
tf::Task composedTask = flowBuilder.composed_of(subflow);
5. 条件执行
- 方法: conditional
- 描述: 支持任务图中的条件分支。
- 功能:
- 根据运行时条件执行不同的任务。
- 适用于实现工作流中的决策逻辑。
- 示例:
tf::Task conditionTask = flowBuilder.emplace([](tf::Condition& cond) {
if (some_condition) {
cond.set_branch(0); // 执行分支 0
} else {
cond.set_branch(1); // 执行分支 1
}
});
tf::Task branch0 = flowBuilder.emplace([]() { std::cout << "分支 0\n"; });
tf::Task branch1 = flowBuilder.emplace([]() { std::cout << "分支 1\n"; });
conditionTask.precede(branch0, branch1);
派生类
1. tf::Taskflow
- 描述: 继承自 FlowBuilder,提供额外的功能以执行和管理任务流。
- 新增功能:
- run: 使用执行器运行任务流。
- wait: 等待任务流完成。
- dump: 可视化任务依赖图。
2. tf::Subflow
- 描述: 继承自 FlowBuilder,用于在父任务中创建动态任务流。
- 新增功能:
- join: 将子任务流重新加入到父任务。
- detach: 将子任务流分离,独立运行。
使用示例
#include <taskflow/taskflow.hpp>
int main() {
tf::Executor executor;
tf::Taskflow taskflow;
// 创建任务
tf::Task A = taskflow.emplace([]() { std::cout << "任务 A\n"; });
tf::Task B = taskflow.emplace([]() { std::cout << "任务 B\n"; });
tf::Task C = taskflow.emplace([]() { std::cout << "任务 C\n"; });
// 定义依赖关系
A.precede(B, C);
// 执行任务流
executor.run(taskflow).wait();
return 0;
}
总结
FlowBuilder是 Taskflow 中用于构建任务依赖图的强大抽象类。它提供的方法可以轻松创建任务、定义依赖关系,并支持模块化和动态任务流的设计。通过继承 FlowBuilder,tf::Taskflow 和 tf::Subflow 实现了静态和动态工作流的统一接口,使其适用于各种复杂场景。