Taskflow:请求-取消与 性能分析

当向Executor(例如tf::Executor::run)提交任务流时,Executor返回一个tf::Future对象,该对象将保存执行结果。tf::Future是来自std::future的派生类。除了std::future的基本方法外,您还可以调用tf::Future::cancel来取消正在运行的任务流的执行。以下示例取消了任务流的提交,该任务流包含1000个任务,每个任务运行一秒钟。

cpp 复制代码
#include <taskflow/taskflow.hpp>
int main() {

    tf::Executor executor;
    tf::Taskflow taskflow;

    for(int i=0; i<1000; i++) {
    taskflow.emplace([](){ 
        std::this_thread::sleep_for(std::chrono::seconds(1));
        std::cout<<"Task\n";
    });
    }

    // submit the taskflow
    tf::Future<void> fu = executor.run(taskflow);

    // std::this_thread::sleep_for(std::chrono::seconds(2));
    // request to cancel the above submitted execution
    fu.cancel();

    // wait until the cancellation completes
    fu.get();

    taskflow.dump(std::cout);
}

当请求取消时,executor将停止调度任务流的其余Task。但已经运行的Task将继续完成。当所有这些运行Task完成后,取消被视为完成。要等待取消完成,您可以明确调用tf::Future::get, 注意, 一定要调用tf::Future::get等待executor执行完毕,否则可能会有未知的风险:

cpp 复制代码
tf::Executor executor;
{
  tf::Taskflow taskflow;
  
  for(int i=0; i<1000; i++) {
    taskflow.emplace([](){});
  }

  tf::Future fu = executor.run(taskflow);

  fu.cancel();  // there can still be task running after cancellation

} // destroying taskflow here can result in undefined behavior

tf::Future::cancel不保证立即取消。

性能分析

所有任务流程序都带有一个轻量级分析模块,以观察每个executor中的Worker活动。要启用分析器,需要将环境变量TF_ENABLE_PROFILER设置为存储分析结果的文件名。

cpp 复制代码
~$ TF_ENABLE_PROFILER=result.json ./my_taskflow
~$ cat result.json
[
{"executor":"0","data":[{"worker":12,"level":0,"data":[{"span":[72,117],"name":"12_0","type":"static"},{"span":[121,123],"name":"12_1","type":"static"},{"span":[123,125],"name":"12_2","type":"static"},{"span":[125,127],"name":"12_3","type":"static"}]}]}
]

然后将下面的json文本拷贝到:Taskflow Profiler, 进行可视化分析。

相关推荐
卷福同学1 天前
QClaw内测体验,能用微信指挥AI干活了
人工智能·算法·ai编程
sali-tec1 天前
C# 基于OpenCv的视觉工作流-章34-投影向量
图像处理·人工智能·opencv·算法·计算机视觉
xiaoye-duck1 天前
《算法题讲解指南:递归,搜索与回溯算法--递归》--3.反转链表,4.两两交换链表中的节点,5.快速幂
数据结构·c++·算法·递归
Eward-an1 天前
【算法竞赛/大厂面试】盛最多水容器的最大面积解析
python·算法·leetcode·面试·职场和发展
山栀shanzhi1 天前
归并排序(Merge Sort)原理与实现
数据结构·c++·算法·排序算法
阿豪学编程1 天前
LeetCode438: 字符串中所有字母异位词
算法·leetcode
Trouvaille ~1 天前
【递归、搜索与回溯】专题(七):FloodFill 算法——勇往直前的洪水灌溉
c++·算法·leetcode·青少年编程·面试·蓝桥杯·递归搜索回溯
地平线开发者1 天前
征程 6P codec decoder sample
算法·自动驾驶
地平线开发者1 天前
征程 6X Camera 接入数据评估
算法·自动驾驶
Storynone1 天前
【Day23】LeetCode:455. 分发饼干,376. 摆动序列,53. 最大子序和
python·算法·leetcode