协程框架(libcopp) 小幅优化

author: owent categories:

  • Article

  • Blablabla

    date: 2019-06-22 12:26:58

    draft: false

    id: 1907

    tags:

    tags:

  • libcopp

  • stack pool

  • benchmark

  • coroutine

  • goroutine

  • boost

  • context

  • 协程

    title: 协程框架(libcopp) 小幅优化

    type: post

最近抽空继续对 libcopp 进行了更新和小幅优化。 首先的Merge了 boost.context 1.70.0 。这次boost.context的更新似乎和它写进 CHANGELOG 里的并不完全一致,匹配的只看到 macho 架构的脏数据操作。 不过另外它增加了新的平台支持 mips64,我目前还是简单导入了,但是平台检测工具还没有写,如果要使用是可以通过编译参数切过去的,不过我感觉没人会这么用吧?我自己用都得看一下之前怎么写的。

boost.context 的其他的变更多是一些平台相关的辅助段,没什么很实际性的作用。这也说明 boost.context 已经趋于非常稳定了。

另外一个稍微大一点的变化是针对于任务管理模块的定时器的,原先的定时器是红黑树(std::multimap)存的类似checkpoint的检查点。它其实对修改任务超时时间的操作不是很友好,过期的checkpoint会仍然保存在map中,直到触发checkpoint才会销毁,所以我也没有提供修改任务超时时间的功能。

现在的实现则是有一点像 LRU 算法的实现,只要任务没有超时,修改超时时间成功的同时会清理掉无效的checkpoint。仍然保留checkpoint的机制是为了多做一次复查,也是一种防御性的编程吧。

新的实现可以任意修改超时时间了,所以我就提供了修改超时时间的接口。这种修改超时时间的操作虽然伴随着风险,但是在某些情况下可能会有些作用。我们项目原来有些回滚任务可以简单地延长任务时间来做回滚操作。但是其实更合理地方法是另起一个任务去做回滚,因为如果当前任务已经超时了,再重设超时时间也是无效的。(task_manager会返回 COPP_EC_NOT_FOUND , 因为已经超时被重管理队列里移除了。)

最后一个小优化是 C++11 以上默认使用unordered_map而不是map去存储协程任务了,这对cache友好一些。之前计划的对 C++20 协程的接入暂时还没时间做,后面再说吧。

新的功能实现我先放到了 v2 分支,暂时还没有合入 master 。因为有一些API上的调整,先在我现在的项目中运行一段时间没问题的话一起作为 1.2.0 版本发布出去和更新vcpkg版本。新版本想直接使用的童鞋也可以直接clone v2 分支。

比较郁闷的是新的API和流程我都加了单元测试,然而覆盖率下降了,( T _ T ), 后面我再补一点吧。

Last updated