尝试写了一个最简单的 c++协程库,专治回调地狱,能对接任何全异步框架

2023-03-28 17:09:43 +08:00
 kkhaike

项目

起因

公司一些老项目使用了 brpc,写全异步的时候被回调地狱折磨,一想到现在都快 c++23 了,何不用协程解决问题,而现有的开源协程框架都要求从底层用起(很难与 brpc 结合)

思路

看完c++20 协程文档(感觉每一句都挺重要。。),有了用引用计数方案管理协程的想法

简单的说,就是当一个协程被 co_await 挂起后,由最晚运行的回调线程负责恢复,这样就不用从底层开始管理协程生命周期了

限制

所有包装使用的 异步函数 必须满足

  1. 函数无返回(void),并且回调函数也是:即类似 void func(int a, std::function<void(int)) cb)
  2. 函数正常运行,必定调用回调
  3. 函数不调用回调则必定抛出异常

样例

https://github.com/kkHAIKE/sco/blob/main/main.cpp

解释:

  1. some(1, 2).start_root_in_this_thread(); 在一个线程中开始启动协程
  2. co_await sco::call_with_callback(&test, a, b, sco::cb<void(int,int)>(c, d)); 包装 异步函数 test

输出

test return
some end
2,3
test return
some return
3,4

后记

  1. 各位大佬点个 star 吧
  2. 这个思路有前景吗?如果有的话,我会投入一些时间到这个项目
3652 次点击
所在节点    C++
23 条回复
kkhaike
2023-03-28 22:34:59 +08:00
@jdz 是我加的,协程接口主要是实现 co_await 这个关键字的细节,我在给异步函数的回调中加入了恢复协程的代码
kkhaike
2023-04-10 11:18:18 +08:00
该项目已经 release 了第一个版本,让老项目使用协程 happy 起来吧 😊
weeei
2023-04-21 16:28:14 +08:00
good ,mark

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/927907

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX