当前位置: 首页 > news >正文

开源项目C++ Workflow学习

Workflow是一个面向高并发网络服务的异步编程框架。它最核心的思想是:

把所有异步操作抽象成任务(Task),再把任务组织成工作流(Workflow)。

很多传统 C++ 网络库只负责网络 I/O,而 Workflow 希望把网络、文件、计算、定时器等全部统一到同一种任务模型中。


一、Workflow 的主要特点

1. 全异步、非阻塞

Workflow 中几乎所有 I/O 都是异步的:

  • HTTP
  • HTTPS
  • Redis
  • MySQL
  • DNS
  • 文件 I/O

例如:

WFHttpTask *task = WFTaskFactory::create_http_task( "http://www.baidu.com", 0, 0, callback); task->start();

调用start()后立即返回。

真正的数据收发在后台线程中完成。

当任务结束时:

callback(task);

才会被自动调用。

因此:

  • 不会阻塞线程
  • 不需要手动管理 epoll
  • 不需要自己写事件循环

2. 串行任务流(Series)

Workflow 最大特色之一。

多个异步任务可以写成:

HTTP请求 ↓ 解析数据 ↓ MySQL查询 ↓ Redis缓存 ↓ 返回客户端

代码:

WFHttpTask *t1 = ... WFMySQLTask *t2 = ... series_of(t1)->push_back(t2);

框架保证:

t1完成 ↓ 执行回调 ↓ 自动执行t2

开发者不需要自己维护状态机。

传统异步编程:

回调嵌套地狱

Workflow:

任务链

3. 并行任务(ParallelWork)

多个任务可同时执行:

ParallelWork *pw = Workflow::create_parallel_work(cb); pw->add_series(s1); pw->add_series(s2); pw->add_series(s3); pw->start();

框架自动等待:

所有任务完成 ↓ 执行最终回调

非常适合:

  • 多数据库查询
  • 聚合服务
  • 微服务调用

例如:

用户信息 订单信息 推荐信息

同时请求。


4. 高性能

Workflow 底层采用:

  • epoll(Linux)
  • kqueue(BSD/macOS)

实现单机百万连接。

特点:

Reactor + 线程池

并且:

  • 无锁设计较多
  • 连接池
  • 内存池
  • 零拷贝

都做了优化。


5. 内置协议丰富

支持:

协议支持
HTTP/HTTPS
Redis
MySQL
Kafka
DNS
文件IO

开发者不需要再找第三方客户端。


6. 统一任务模型

所有任务都继承自:

SubTask

包括:

网络任务 文件任务 定时器任务 计算任务

统一接口:

task->start();

二、Workflow 的总体架构

框架大致如下:

用户代码 │ WFTaskFactory │ 创建各种Task │ +-------------+ | SubTask | +-------------+ │ +------------+------------+ │ │ SeriesWork ParallelWork │ │ +------------+------------+ │ Scheduler │ +---------+---------+ │ │ Reactor线程 Executor线程 │ │ epoll 计算/回调

三、核心实现机制

1. Reactor 模型

Workflow 使用经典:

Reactor + epoll

架构。

每个 Reactor 线程:

while (true) { epoll_wait(); 处理可读事件; 处理可写事件; 超时处理; }

流程:

socket可读 ↓ epoll通知 ↓ Reactor线程处理 ↓ 数据读入缓冲区 ↓ 任务状态推进

Reactor 线程只做:

网络IO 状态切换

不会执行耗时业务逻辑。


2. 状态机驱动

每个网络任务实际上都是一个状态机。

例如 HTTP:

INIT ↓ DNS ↓ CONNECT ↓ SEND ↓ RECV ↓ PARSE ↓ DONE

源码中大量存在:

switch(state) { case ST_CONNECT: ... case ST_RECV: ... }

网络事件不断推动状态机向前运行。


3. SeriesWork

源码中:

SeriesWork

内部维护:

std::queue<SubTask *>

执行流程:

当前任务完成 ↓ done() ↓ SeriesWork::pop() ↓ 启动下一个任务

所以:

series_of(task)->push_back(next);

只是把任务加入队列。


4. ParallelWork

内部维护:

剩余任务计数器

每个 Series 完成:

counter--

当:

counter == 0

触发最终回调。

类似:

CountDownLatch

5. Executor 线程池

网络线程不能执行:

数据库解析 JSON解析 压缩 业务逻辑

否则会阻塞整个 Reactor。

因此:

IO线程 ↓ 任务完成 ↓ 投递到Executor线程池 ↓ 执行回调

实现:

生产者消费者模型

大致:

while (true) { task = queue.pop(); task->dispatch(); }

6. 连接池

对于:

HTTP KeepAlive MySQL Redis

Workflow 内置连接池。

连接不会每次:

connect() close()

而是:

获取空闲连接 ↓ 使用 ↓ 归还池中

极大减少系统调用开销。


四、为什么 Workflow 性能高?

原因主要有:

  1. 全异步非阻塞
  2. epoll 事件驱动
  3. Reactor 与业务线程分离
  4. 连接复用
  5. 减少线程切换
  6. 大量无锁/低锁设计
  7. 统一任务调度模型
  8. 状态机驱动而不是阻塞等待
http://www.jsqmd.com/news/1125475/

相关文章:

  • AI时代依然受用:那些越过越好的人,都学会了这件事。
  • [MAF预定义ChatClient中间件-04]ReducingChatClient——精减对话历史又不丢失基本语义
  • 2026年避坑攻略:如何挑选性价比高的外墙保温装饰一体板厂家
  • 回答并不难理解,因为——腾讯已经成为所有互联网创业者的噩梦。
  • 系统架构师-基础到企业应用架构-表现层
  • 为什么简单的Agent循环会崩成slop?结构化验证才是解药
  • 基于51单片机水平倾角检测仪系统 三轴ADXL345加速度 嵌入式开发21(设计源文件+万字报告+讲解)(支持资料、图片参考_相关定制)_
  • 2026年短视频矩阵服务商怎么选?实用指南揭秘
  • GPT充值以后怎么用才不浪费?开发者把 ChatGPT 用进接口文档、代码审查和回归测试的 4 个工作流
  • (其他)服务器上传和下载文件
  • OpenClaw模块化机器人抓取系统技术解析与应用案例
  • Nacos配置中心敏感数据加密实战:从原理到部署的完整指南
  • 散列表(Hash Table)从理论到实用(上)
  • NSK精细滚珠丝杠W1602MS技术指南
  • ACL包过滤、NAT技术、广域网协议
  • Linux文件操作核心命令与实用技巧详解
  • GORM的字段类型推导源码解析
  • 1.逻辑结构与逻辑工程学
  • 【电赛/毕设终极杀器】超越 PID 与 LQR!控制界的黑魔法:自抗扰控制 (ADRC) 原理与 STM32 硬核部署指南
  • 基于51单片机的火灾报警系统设计 智能烟雾报警器温度检测21(设计源文件+万字报告+讲解)(支持资料、图片参考_相关定制)_
  • C盘清理工具合集 Windows系统垃圾深度清理 磁盘瘦身 下载
  • YOLO11视频目标检测实战:从环境配置到高级应用
  • Engine-Sim技术深度解析:实时发动机模拟与音频合成的工程实现
  • NSK滚珠丝杠W3205SS技术解析
  • Dify新手入门:从账号界面到AI工作流实战指南
  • 手把手教你用8款一键生成论文工具,极速搞定各类论文
  • Agent 架构
  • 基于PyTorch与UrbanSound8K数据集的环境声音分类实战
  • 智能项目管理周报:AI 可以汇总状态,不能替代判断
  • SRS 4.0 HTTP回调实战:SpringBoot 实现 7 种事件鉴权与业务集成