C++异步网络库workflow系列教程(3)Series串联任务流

往期教程

如果觉得写的可以,请给一个点赞+关注支持一下

观看之前请先看,往期的两篇博客教程,否则这篇博客没办法看懂

  • workFlow c++异步网络库编译教程与简介

  • C++异步网络库workflow入门教程(1)HTTP任务

  • C++异步网络库workflow系列教程(2)redis任务

简介

首先,workflow是任务流的意思,在workflow中万物皆为任务流.任务流分为以下两种

  • 串联:就像链表一样,前面的任务执行完了后执行后面的
  • 并联:可以理解为开了多个线程,并发执行任务

无标题

示例代码

首先,还是老规矩,先看代码示例,我会将所有新出现的成员一一进行介绍

#include <workflow/WFFacilities.h>
void seriesCallback(const SeriesWork *series){fprintf(stderr,"series callback , free pkey\n");std::string *pkey = static_cast<std::string *>(series->get_context());delete pkey;
}
void callback(WFRedisTask *redisTask){protocol::RedisRequest *req = redisTask->get_req();protocol::RedisResponse *resp = redisTask->get_resp();int state = redisTask->get_state();int error = redisTask->get_error();protocol::RedisValue value;//value对象专门用来存储redis任务的结果switch (state){case WFT_STATE_SYS_ERROR:fprintf(stderr,"system error: %s\n", strerror(error));break;case WFT_STATE_DNS_ERROR:fprintf(stderr,"dns error: %s\n", gai_strerror(error));break;case WFT_STATE_SUCCESS:resp->get_result(value);if(value.is_error()){fprintf(stderr,"redis error\n");state = WFT_STATE_TASK_ERROR;}break;}if (state != WFT_STATE_SUCCESS){fprintf(stderr, "Failed\n");return;}else{fprintf(stderr, "Success!\n");}std::string cmd;req->get_command(cmd);if(cmd=="SET"){//firstTask的基本工作做完了//创建新任务,把新任务加入到本序列的末尾fprintf(stderr,"first task callback begins\n");std::string *pkey = static_cast<std::string *>(redisTask->user_data);WFRedisTask *secondTask = WFTaskFactory::create_redis_task("redis://127.0.0.1:6379",0,callback);protocol::RedisRequest *req = secondTask->get_req();req->set_request("GET",{*pkey});SeriesWork* series = series_of(redisTask);series->set_context(static_cast<void *>(pkey));series->set_callback(seriesCallback);series->push_back(secondTask);fprintf(stderr,"first task callback ends\n");}else{//secondTask的基本工作做完了fprintf(stderr,"second task callback begins\n");fprintf(stderr, "redis request, cmd = %s\n", cmd.c_str());if (value.is_string()){fprintf(stderr, "value is a string, value = %s\n", value.string_value().c_str());}else if (value.is_array()){fprintf(stderr, "value is string array\n");for (size_t i = 0; i < value.arr_size(); ++i){fprintf(stderr, "value at %lu = %s\n", i, value.arr_at(i).string_value().c_str());}}fprintf(stderr,"second task callback ends\n");}}
int main(){//创建redis任务//std::string key = "43key1";std::string * pkey = new std::string("43key2");WFRedisTask *firstTask = WFTaskFactory::create_redis_task("redis://127.0.0.1:6379",0,callback);//设置redis任务的属性protocol::RedisRequest *req = firstTask->get_req();req->set_request("SET",{*pkey, "200"});firstTask->user_data = static_cast<void *>(pkey);//启动redis任务firstTask->start();
}

示例剖析

  • 首先我们先看见main函数中第77行firstTask->user_data,如下是该成员的源码实现截图,为一个void*指针,通过变量名我们可以知道这是用来存储用户上下文的变量,可以在响应回调函数中将数据取出来进行使用(如43行中取出使用)

image-20231215163901660

任务流

  • series_of(redisTask)函数可以通过任务流节点获取到该任务节点所属的任务流的指针(在main函数中调用的firstTask->start();便是创建了一个任务流),
  • set_context()与上面的user_data类似,不过set_context设置的生存周期在整个任务流的生存周期,而user_data的生存周期只在所属的任务流节点的生存周期
  • set_callback()用来设置该任务流的清理回调函数,调用时机在该任务流所有任务节点全部执行完毕之后
  • series->push_back(secondTask):secondTask这个任务添加在任务流的末尾节点

代码执行流程梳理

  1. main函数中设置了一个redis任务,任务将执行"SET 43key2 200"这个指令
  2. callback回调函数中,找到该任务所属的任务流,并创建一个新的任务执行"GET 43key2"这个命令,并将这个任务插在任务流后面,
  3. callback回调函数中,执行53行开始的代码

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/225782.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

ThingWorx/Vuforia—工业物联网和AR平台

产品概述 ThingWorx是美国PTC公司旗下的一款物联网和AR平台&#xff0c;它提供了适用于IoT的开发工具和能力&#xff0c;使开发者可以为工业物联网快速构建和部署变革性的智能互联解决方案&#xff0c;使创新者能够快速为当今的智能互联世界提供优异的应用程序、解决方案和用户…

人工智能计算机视觉:解析现状与未来趋势

导言 随着人工智能的迅速发展&#xff0c;计算机视觉技术逐渐成为引领创新的关键领域。本文将深入探讨人工智能在计算机视觉方面的最新进展、关键挑战以及未来可能的趋势。 1. 简介 计算机视觉是人工智能的一个重要分支&#xff0c;其目标是使机器具备类似于人类视觉的能力。这…

k8syaml提供的几个有意思的功能,Kubernetes在线工具网站

k8syaml.cn 提供的几个有意思的功能。 一、yaml资源快速生成 之前编写operator的helm的时候就需要自己写deployment、service、configmap这些资源&#xff0c;那么多字段也记不清&#xff0c;都是先找个模版&#xff0c;然后copy改改&#xff0c;再看官方文档&#xff0c;添加…

智能优化算法应用:基于和声算法3D无线传感器网络(WSN)覆盖优化 - 附代码

智能优化算法应用&#xff1a;基于和声算法3D无线传感器网络(WSN)覆盖优化 - 附代码 文章目录 智能优化算法应用&#xff1a;基于和声算法3D无线传感器网络(WSN)覆盖优化 - 附代码1.无线传感网络节点模型2.覆盖数学模型及分析3.和声算法4.实验参数设定5.算法结果6.参考文献7.MA…

Jenkins Pipeline 脚本优化实践:从繁琐到简洁

引言 在持续集成的过程中&#xff0c;Jenkins Pipeline 是非常关键的一环。它定义了如何自动编译、测试和部署代码。随着项目的不断发展&#xff0c;Pipeline 的复杂性也在不断上升&#xff0c;这就需要我们持续优化 Pipeline 脚本&#xff0c;以提高代码的可读性和维护性。本…

Python如何匹配库的版本

目录 1. 匹配库的版本 2. Python中pip&#xff0c;库&#xff0c;编译环境的问题回答总结 2.1 虚拟环境 2.2 pip&#xff0c;安装库&#xff0c;版本 1. 匹配库的版本 &#xff08;别的库的版本冲突同理&#xff09; 在搭建pyansys环境的时候&#xff0c;安装grpcio-tools…

RT-DETR优化:轻量化卷积设计 | DualConv双卷积魔改RT-DETR结构

🚀🚀🚀本文改进: DualConv双卷积魔改v8结构,达到轻量化的同时并能够实现小幅涨点 🚀🚀🚀RT-DETR改进创新专栏:http://t.csdnimg.cn/vuQTz 学姐带你学习YOLOv8,从入门到创新,轻轻松松搞定科研; RT-DETR模型创新优化,涨点技巧分享,科研小助手; 1.DualC…

软件测试经典面试题(答案解析+视频讲解)

前言 &#xff08;第一个就刷掉一大批人&#xff09; 有很多“会自动化”的同学来咨询技术问题&#xff0c;他总会问到我一些元素定位的问题。元素定位其实都不算自动化面试的问题。 一般我都会问&#xff1a;你是定位不到吗&#xff1f;通常结果都是说确实定位不到。 做自…

真正可行的vue3迁移到nuxt3方法(本人亲测,完全避坑)

终于到了总结经验的时候了&#xff0c;这绝对是全网唯一、完全真正可行的干货。 在我看来&#xff0c;知识就是要拿来分享的&#xff0c;分享给他人也是在提高自己。我绝对不会搞什么订阅或者vip专栏来搞钱坑害各位&#xff0c; 因为我在csdn写文章最主要的目的是为了记录和总…

OpenJDK十几种发行版中强烈推荐的发行版:Adoptium Eclipse Temurin和Amazon Corretto

Adoptium Eclipse Temurin官网地址&#xff1a;Home | Adoptium 支持及维护它的厂家&#xff1a; 说明&#xff1a;它的前身是著名的AdoptOpenJDK&#xff0c;更新到jdk16后就停止更新了&#xff0c;因为AdoptOpenJDK移交给Eclipse基金会后改名为&#xff1a;Adoptium Eclipse…

多线程 (下) - 学习笔记

常见锁策略 乐观锁和悲观锁 悲观锁 总是假设最坏的情况, 每次去拿数据的时候都会认为会被别人修改, 因此会上锁, 防止数据在使用过程中被别的线程修改, 乐观锁 假设数据一般情况下不会产生并发冲突,因此在拿数据,操作数据的过程中不加锁, 而在数据进行提交更新的时候, 才会正…

LeetCode day24

LeetCode day24 今天主打一个快乐happy(▽ʃ♡ƪ)&#xff0c;主要是今天写哈夫曼树被经典文件读取坑麻了&#xff08;为啥绝对路径能读取&#xff0c;相对不行。罢了&#xff09; 一个中等题&#xff0c;但是咋感觉很小学捏。。。 2177. 找到和为给定整数的三个连续整数 相…

C与C++编程语言的区别和联系

一、引言 C和C是两种广泛使用的编程语言&#xff0c;它们都在软件开发领域有着广泛的应用。虽然C是从C语言演化而来的&#xff0c;但两者之间存在一些重要的区别和联系。本文将详细介绍这两种编程语言的相同点和不同点&#xff0c;并通过实际例子进行说明。 二、C与C的相同点 …

RocketMq常见问题

如何保证消息不丢失? 产生丢失消息的节点主要有以下几点 生产者发到brokerbroker把消息从缓存写入磁盘breker同步到从节点消费者消费消息消息积压太多, 会删除历史消息, 这里不会校验消息有没有消费 解决: 生产者同步发送消息, 如果发送失败, 写重试逻辑, 如果重试多次还失…

基于Java SSM框架实现抗疫医疗用品销售系统项目【项目源码+论文说明】

基于java的SSM框架实现抗疫医疗用品销售系统演示 摘要 随着科学技术的飞速发展&#xff0c;社会的方方面面、各行各业都在努力与现代的先进技术接轨&#xff0c;通过科技手段来提高自身的优势&#xff0c;抗疫医疗用品销售平台当然也不能排除在外。抗疫医疗用品销售平台是以实…

微服务黑马头条(简略笔记)

Linux中nacos的拉取安装 拉取naocs镜像&#xff1a;docker pull nacos/nacos-server:1.2.0创建容器&#xff1a;docker run --env MODEstandalone --name nacos --restartalways -d -p 8848:8848 nacos/nacos-server:1.2.0访问地址&#xff1a;http://192.168.200.130:8848/n…

深入理解LightGBM

1. LightGBM简介 GBDT (Gradient Boosting Decision Tree) 是机器学习中一个长盛不衰的模型&#xff0c;其主要思想是利用弱分类器&#xff08;决策树&#xff09;迭代训练以得到最优模型&#xff0c;该模型具有训练效果好、不易过拟合等优点。GBDT不仅在工业界应用广泛&#…

http正向代理测试,nginx反向代理中转正向代理服务器

有3台服务器如下&#xff1a; 192.168.111.201&#xff08;反向代理到正向代理服务器&#xff09; 192.168.111.202&#xff08;正向代理服务器&#xff09; 192.168.111.203&#xff08;目标WEB系统&#xff09; 防火墙网络策略如图所示: 1、192.168.111.200 只能访问 192.168…

配置802.1x认证

实验目的&#xff1a; 某公司拥有两个部门&#xff0c;市场部和人事部门&#xff0c;市场部和人事部的IP地址分别为10.1.11.0/24、10.1.21.0/24两个IP网段。市场部属于vlan11&#xff0c;人事部属于vlan21。现在需要在SW2上配置802.1x认证&#xff0c;实现终端用于只有认证成功…

一句话生成 3D 人脸资产|ChatAvatar 角色生成 AI 登陆 Cocos

近几个月以来&#xff0c;AIGC 一路高歌猛进&#xff0c;让我们见证了一场行业革命。 然而 AIGC 在 3D 资产领域却仍是业内的难题&#xff0c;少有突破。 小编今天给大家推荐一个 3D 角色 AIGC 利器 ChatAvatar。它可以算是 3D AIGC 领域的一匹黑马&#xff0c;走在了领域的前沿…