Workflow学习笔记(一):初识

1.编程范式

1.1 程序=协议+算法+任务流

  • 协议

    • 大多数情况下,用户使用内置通用网络协议,如:http,redis或各种rpc。
    • 用户可方便自定义网络协议,只需提供序列化和反序列化函数,就可定义出自己的client/server。
  • 算法

    • 算法是与协议对称的概念。如果说协议的调用是rpc,算法的调用就是一次apc(Async Procedure Call)。
    • 提供了一些通用算法,如,sort,merge,psort,reduce,可以直接使用。
    • 与自定义协议相比,自定义算法使用更常见。任何一次边界清晰的复杂计算都应包装成算法。
  • 任务流

    • 任务流就是实际业务逻辑,把开发好的协议与算法放在流程图里使用起来。
    • 典型的任务流是一个闭合的串并联图。复杂的业务逻辑可能是一个非闭合的DAG。
    • 任务流图可以直接构建,也可以根据每一步结果动态生成。所有任务都是异步执行的。

1.2 结构并发与任务隐藏

  • 五种基础任务:通信、计算、文件IO、定时器和计数器。
  • 一切任务都由任务工厂产生,用户通过调用接口组织并发结构,如,串联并联及DAG等。
  • 大多数情况,用户通过任务工厂产生的任务都隐藏了多个异步过程,但用户并不感知。
    • 一次http请求,可能包含许多异步过程(DNS,重定向),但对用于而言,就是一次通信任务。
    • 文件排序,看起来是一个算法,但其中包含复杂的文件IO与CPU计算的交互过程。
    • 若将业务逻辑想象成用设计好的电子元件搭建电路,那么每个电子元件内部可能又是一个复杂电路。
    • 任务隐藏机制大幅减少了用户需要创建的任务数量及回调深度。

1.3 回调与内存回收机制

  • 一切调用都是异步执行,几乎不存在占用线程等待的操作。
  • 显示的回调机制。用户清楚自己在写异步程序。
  • 通过一套对象生命周期机制,大幅度简化异步程序的内存管理
    • 任何框架创建的任务,生命周期都是从创建到callback函数运行结束为止,没有泄漏风险。如果创建了任务后不想运行,则需要通过dissmiss()接口删除。
    • 任务中的数据,如,网络请求的resp,也会随着任务被回收。此时用户可以通过std::move()将需要的数据移走。
    • 项目中不使用任何智能指针来管理内存。
  • 尽量避免用户级别派生,以std::function封装用户行为,包括:
    • 任何任务的callback。
    • 任何server的process。符合FaaS(Function as a Service)思想。
    • 一个算法的实现,简单来讲也是一个std::function
    • 如果深入使用,又会发现一切皆可派生。

2.编译使用

2.1 编译安装

1
2
3
4
5
6
7
8
# 1.编译安装
>> git clone https://github.com/sogou/workflow
>> cd workflow && make && make install
# 2.添加环境变量
>> vim /etc/ld.so.conf.d/local.conf
/usr/local/lib
# 3.载入环境变量
>> ldconfig

2.2 简单使用

  • (1)demo源码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
/*
* @Author: chenjingyu
* @Date: 2026-01-27 10:27:33
* @Contact: 2458006466@qq.com
* @Description: demo.cc
*/
#include <stdio.h>
#include <workflow/WFHttpServer.h>

int main() {
WFHttpServer server([](WFHttpTask *task) {
task->get_resp()->append_output_body("<html>Hello World!</html>");
});

if (server.start(8888) == 0) {
getchar(); // press "Enter" to end
server.stop();
}

return 0;
}
  • (2)编译运行:
1
2
>> g++ demo.cc -o demo -lworkflow -lpthread -lssl -lcrypto
>> ./demo
  • (3)网页端打开:http://localhost:8888/,即可看到效果

workflow_demo

参考资料