协程框架(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