项目工作:
- 封装异步任务:Task作为协程函数的返回值,支持co_await,获取结果(通过promise_type实现)。Task::promise_type除实现常见的函数外,还可以作为调度对象。
- 支持异步语法:
- 对单个Task: 可调用co_await(等待直到就绪)、也可以调用wait_for(超时句柄加入调度,就绪时取消句柄)。
- 对多个Task: 可调用gather等待多个Task完成(依次co_await多个Task,成功的,将返回值设置到tuple返回,否则设置异常)。
- wait_for和gather都是通过awaiter完成的。
- 协程调度:线程可以获取eventloop,eventloop提供定时器、协程句柄调度
- 定时器:通过堆来对定时器事件排序。call later\at\soon将句柄加入调度(可以为超时句柄、协程句柄)
- eventloop:while循环:epoll、定时器事件处理、就绪事件处理
- 协程需要等待读写事件,co_await eventloop.wait_event(), 加入到epoll监听,将协程句柄作为事件的回调函数
- 协程调度:协程 A co_await一个 Task或其他等待体 B,B通过await_suspend将其句柄记录,在最后的final_suspend中将句柄加入调度。(callee将记录caller的协程句柄,等到callee执行完成,就将caller的句柄加入调度)。从而可以有协程调用链。
用到的cpp新特性、语法
- c++20 coroutine
- 数据结构:
- tuple
- variant
- 模板写法:
- concepts
- requires
- 参数包/可变参数
- 模板参数推导指引
性能测试
libevent、libuv、asio、asyncio
和以上三个库进行benchmark对比,测试场景为echo server