Workflow是搜狗近日开源的一款C++后端异步引擎,性能强劲。本文介绍Workflow的一项重要理念:Task。

一切皆是Task

在Workflow的编程范式中,一切可以独立完成某项任务的、边界清晰明确的代码模块,都可以抽象为一个Task。 Task之间可以互相组合,从而可以由简单Task构建出复杂Task。 从Client-Server的角度来看,无论是作为客户端还是服务器,Task理念都能很好地抽象实际情况。

Client请求是Task

使用Workflow作为Client,十分方便。 例如,创建一个HTTP请求,可以这么写:

std::function<void(WFHttpTask *)> http_callback;auto *task = WFTaskFactory::create_http_task("http://www.sogou.com", 1, 3, http_callback);task->start();

这条语句创建了一个对http://www.sogou.com的请求,允许1次重定向,最多可以重试3次,通信结束后自动调用callback即http_callback。 callback结束后Task执行完毕,自动销毁。 这个请求被包装为一个Task返回给用户,用户具体的操作都可以在这个Task上进行。

除了WFHttpTask,Workflow还内置了WFRedisTaskWFMySQLTaskWFKafkaTask等网络Task,以及可以用来创建线程任务的WFThreadTask、创建定时器的WFTimerTask、创建类似goroutine的WFGoTask、用于协调同步的WFCounterTask和构建有向无环图的WFGraphTask等丰富多彩的Task。 这些Task大多可以通过工厂类WFTaskFactory的静态方法创建。

Server处理对象也是Task

上面的程序片段已经展示了如何发起一个HTTP请求,下面的程序说明如何构建一个HTTP Server。

void process(WFHttpTask *task)
{task->get_resp()->append_output_body("<p>Hello</p>");
}WFHttpServer server(process);
server.start(8080);

Workflow的理念是一切皆是Task,作为Server,也可以用Task的方式实现。 server.start(8080)之后,当有客户端对8080端口发起HTTP请求时, Workflow会生成一个Task,并调用void process(WFHttpTask *)来处理这个Task。 因此,用户只要在process中实现服务逻辑,即可构建出一个服务器。

复杂的服务器逻辑,很有可能需要Client Task的帮助, 比如一个代理服务器,收到Client的请求之后,需要向真实的Server发出请求,并将应答回复给Client, 这种Task之间的组合,正是Workflow擅长的地方。

Task间的相互组合

从Task的角度来看,重要的事情有两件:一是这个Task做什么,二是这个Task做完之后下一个Task是谁。 对于后一个问题,Workflow提供了多种Task间的组合方式。

串并联

auto *parallel = Workflow::create_parallel_work(nullptr);auto *t1 = WFTaskFactory::create_http_task("http://www.sogou.com", 1, 3, nullptr);
auto *t2 = WFTaskFactory::create_go_task("A", some_function_A);
auto *t3 = WFTaskFactory::create_go_task("B", some_function_B;
auto *t4 = WFTaskFactory::create_redis_task("redis://127.0.0.1:6379/1", 3, nullptr);parallel->add_series(Workflow::create_series_work(t2, nullptr));
parallel->add_series(Workflow::create_series_work(t3, nullptr));auto *series = Workflow::create_series_work(t1, nullptr);
series->push_back(parallel);
series->push_back(t4);series->start();

上面的代码,实现了下图中的先后次序。 当t1的callback执行结束时,t2t3将会开始执行;当t2t3的callback都执行结束时,t4将会开始执行。

          |--> t2 ---|
--> t1 ---|          |--> t4 ---|--> t3 ---|

这种串并联机制是十分朴素自然的组织方式,可以应对大多数简单的场景。 SeriesWork由Task串联组成,ParallelWorkSeriesWork并联组成,它们都可以设置callback。 同时,Workflow对于SereisWork和ParallelWork进行了一定的约束:

  • SeriesWork由若干Task串联而成,任何运行中的Task都属于某个SeriesWork;
  • ParallelWork由若干SeriesWork并联而成;
  • ParallelWork是一种Task。

之所以有此约束,是为了防止滥用串并联而带来的复杂性。

动态地串并联

串并联除了可以静态地组装,也可以动态地在callback中修改。 例如:

auto *t1 = WFTaskFactory::create_http_task("http://www.sogou.com", 1, 3, [](WFHttpTask * task){auto *t2 = WFTaskFactory::create_go_task("", [](){});auto *series = series_of(task);series->push_back(t2);
});t1->start();

由于Task必然是某个SeriesWork的一环(即使没有显式创建此SeriesWork),因此可以在Task的callback中拿到这个SeriesWork,向其添加新的Task。 需要注意的是,无法通过类似的方法向ParallelWork中添加新的SeriesWork,因为: 第一,并非所有的SeriesWork都是某个ParallelWork的一支; 第二,ParallelWork会同时启动它包含的所有SeriesWork,之后再次试图添加,是违反语义的。

总结

Workflow的Task理念是一种完备的编程方法,巧妙地将各种异步过程结合起来,方便用户使用。 Workflow还有其它有趣的特色,后面会继续介绍。 在Workflow的主页上,也有十分详细的进一步的文档介绍,欢迎各位访问。

Workflow 一切皆是Task相关推荐

  1. This task is currently locked by a running workflow and cannot be edited

    转自:http://geek.hubkey.com/2007/09/locked-workflow.html 转自:http://blogs.code-counsel.net/Wouter/Lists ...

  2. 基于Teamplate Workflow组件的工组流开发概述

    简要整理了基于Teamplate Workflow组件进行工作流开发的步骤.<?xml:namespace prefix = o ns = "urn:schemas-microsoft ...

  3. GATK官方推荐的workflow语言-WDL

    欢迎关注"生信修炼手册"! 在GATK4的best practice中,不再像以前那样给出每个步骤对应的代码,而是直接给出了官方使用的pipeline.这些pipeline采用WD ...

  4. 写在2021: 值得关注/学习的前端框架和工具库

    前言 最近在知乎看到了这么个问题:学完Vue还有必要学习React和Node吗?[1], 有很奇妙的感觉,因为我在最开始入门前端时,也是以Vue入的门,在"学完"Vue之后, 我也 ...

  5. cube云原生机器学习平台-架构(四)

    全栈工程师开发手册 (作者:栾鹏) 一站式云原生机器学习平台 前言:cube是开源的云原生机器学习平台,目前包含特征平台,支持在/离线特征:数据源管理,支持结构数据和媒体标注数据管理:在线开发,在线的 ...

  6. Informatica元数据库解析

    转载:http://informatica.iblog.com/post/3070/70389 Informatica所有的元数据信息均以数据库表的方式存到了元数据库中.当然Infa本身工具提供了很多 ...

  7. [Camunda BPMN进阶] 电商订单流程设计与调试

    目录 摘要 基于BPMN的软件设计思想 电商订单流程业务场景 基本订单流程BPMN设计 1.最基本流程设计 2. 添加超时未付款自动取消功能 3. 添加15分钟付款提醒 4. 添加用户取消订单事件 进 ...

  8. 阿里云 EMR 基于 Apache DolphinScheduler 产品技术实践和社区贡献

    摘要:本文整理自阿里云 EMR 数据开发团队负责人孙一凡(Evans 忆梵),在 Spark&DS Meetup 的分享.本篇内容主要分为四个部分: 1.我们是谁 2. 为什么选择 Dolph ...

  9. 工作流编排引擎-Temporal

    Concepts introduction Modern problems 您是否曾经开发过需要响应多个异步事件.与不可靠的外部资源通信或跟踪非常复杂事物状态的应用程序? 如果是这样,您可能熟悉无状态 ...

最新文章

  1. IBM认为将AI用于人力资源的价值
  2. 汇编原理实验 --类型统计(字母,数字,其他字符的个数)
  3. 今晚直播 | 平安人寿资深算法工程师姚晓远:对话生成模型的探析与创新
  4. 从零开始学习Node.js例子七 发送HTTP客户端请求并显示响应结果
  5. 三菱伺服自动调谐_三菱伺服在执行离线自动调整之前
  6. 剑指offer面试题30. 包含min函数的栈(辅助栈)
  7. Vbs判断两个Excel文件的内容--将两个Excel文件相同内容写入新建的Excel文件内
  8. 利用Excel的LINEST计算线性拟合的斜率和截距的不确定性
  9. java sql 搜索拼音
  10. 关于画法几何和机械制图有感
  11. Android_JNI编程入门
  12. kali2022.1google输入法
  13. 美国弗吉尼亚大学计算机科学,弗吉尼亚大学计算机科学排名第31(2018年TFE美国排名)...
  14. ORDER BY语句报错Out of sort memory, consider increasing server sort buffer size
  15. 零基础学FPGA(六):FPGA时钟架构(Xilinx为例,完整解读)
  16. 干货分享 | Windows系统下载SRA数据方法——生信小白亲测可行
  17. “卖给我一支笔”:乔布斯会如何应对这个经典问题?
  18. 共享纸巾机系统开发,关于Switch的使用
  19. 离散数学·代数结构【正规子群、商群、群的同态和同构、环与域、格、布尔代数】
  20. 大牛程序员用Java手写JVM:刚好够运行 HelloWorld

热门文章

  1. 基础运维-杂乱篇-持续更新.......
  2. html5用一张图片铺满屏幕,html5绘图铺满整个屏幕
  3. 小心Python爬取了你的微信隐私!用Python分析了数千个微信昵称后,发现了这些秘密!
  4. 记录一个阿里云OSS图片上传错误
  5. 小组取什么名字好_好消息!这座天桥今年年底完工!取什么名字,等你出主意!...
  6. “专车”监管意见最快本月公布
  7. 利用matlab绘制简单IFS图形(Sierpinski三角形和BarnsleyFern巴恩斯利蕨)
  8. 奥比中光深度相机ros2 humble版安装分享
  9. 自动出题软件--阶段性小结
  10. xv6 risc-v trap 笔记