Releases: kedixa/coke
v0.4.1
使用Coke v0.4.1
时必须依赖Workflow v0.11.6
及以上版本。
新增功能
- 移除了对异常的强依赖,可在禁用异常的情况下编译
coke
,但coke/tools
未实现该功能 coke::Future
增加cancel
接口,关联的coke::Promise
需要通过is_canceled
主动获取该状态,并决定是否要取消当前任务
新增组件
coke::SyncGuard
对WFGlobal::sync_operation_begin
和WFGlobal::sync_operation_end
进行了封装coke::ScopeExit
,通用的作用域防护组件
可在<experimental/scope>
进入标准库前用于实现类似的功能
修复问题
- 修复容器
queue
、deque
对内存分配器约束错误的问题
其他
- 增加了许多文档,仅网络和文件IO部分尚未完成
- 增加了示例019-021
- 支持使用
bazel 8.0
构建当前项目
v0.4.0
使用Coke v0.4.0
时必须依赖Workflow v0.11.6
及以上版本。
不兼容改动
将TimedSemaphore
、TimedMutex
、TimedSharedMutex
、TimedCondition
组件重命名为Semaphore
、Mutex
、SharedMutex
、Condition
。在最初的构想中,包含Timed
名称的组件基于计时器timer
实现,可以支持try_lock_for
、wait_for
等语义;不含Timed
的名称为基于counter
实现的组件保留,期望该组件以更高效的方式实现,应用于不需要支持超时时间的场景。
timer
即使在取消时也会切换线程并重新调度,而counter
会直接在当前线程执行唤醒后的代码。考虑下述场景,使用后者实现锁机制存在两个重大缺陷。1. 首个获得锁并更新资源的协程会在解锁时直接跳转到下一个即将获得锁的协程中运行,直到最后一个等待锁的协程,并逆序处理完这些任务后才会开始处理首个获得锁的协程的数据,这对首个协程极其不公平;2. 上述解锁过程是递归的,若有较多协程等待同一个锁,递归时会直接栈溢出。
{
// 假设有一个 coke::CounterMutex mtx;
co_await mtx.lock();
auto resource = get_resource();
if (resource.expired()) {
resource = co_await update_and_cache_resource();
}
mtx.unlock();
// 使用资源,可能有些耗时操作但还不至于需要切换计算线程
use_resource(resource);
}
考虑到简洁的名称应当留给更通用的组件,故做此不兼容的名称修改。
新增功能
- 当未捕获的异常逃逸至被detach的协程时,将其激活后再终止进程,便于在调试器中获取异常类型
- coke可等待对象可以在其他协程框架中使用;其他协程框架的可等待对象不可直接在coke框架中调用,这是因为同一个coke::Task中的所有任务都运行在同一个SeriesWork中,异步等待其他协程会破坏这种约定
coke::MySQLConnection
支持复用connection id
,以避免RouteResult
数量持续增长的问题coke::PriorityQueue
支持仅可移动构造和赋值的对象,但要求移动时不可抛出异常
新增组件
- Go语言用户常见的组件
coke::WaitGroup
- 异步锁包装器
coke::UniqueLock
、coke::SharedLock
移除组件
- 移除
coke::GenericAwaiter<T>
,可直接使用coke::BasicAwaiter<T>
v0.3.0
使用Coke v0.3.0
时建议依赖Workflow v0.11.5
版本。
新增功能
- 支持指定默认
SeriesWork
创建器- 当一个
SubTask
在coke
协程当中被启动时,若当前协程没有关联的SeriesWork
,会使用用户指定的SeriesWork
创建器创建一个SeriesWork
- 当一个
- 支持在
coke
协程间传递异常,若被detach
的协程结束时包含未被处理的异常,会调用std::terminate
终止进程;coke::Future
支持捕获异常 - 增加
coke::create_future
函数以支持通过coke::Task
和SeriesWork
创建器来创建coke::Future
对象 - 增加
coke::wait_futures
和coke::wait_futures_for
函数,支持等待指定数量的coke::Future
就绪 coke::sleep
支持以用户指定的void *addr
进行休眠任务,并通过coke::cancel_sleep_by_addr
取消尚未结束的休眠任务,相比通过unique id
的方式可以少保存一个整数,而唯一的addr
可使用生命周期长于休眠任务的全局或局部变量的地址
新增组件
- 条件变量
coke::TimedCondition
- 异步容器
coke::Queue
、coke::PriorityQueue
、coke::Stack
、coke::Deque
- 命令行参数解析器
coke::OptionParser
- 该组件的诞生,使
coke
的example
和benchmark
部分不再依赖getopt.h
,在任意支持workflow >= 0.11.3
和C++ 20
的平台上均可以完整构建coke
- 该组件的诞生,使
- 同步门闩
coke::SyncLatch
coke::StopToken
,在前台协程和后台协程间传递停止事件的工具,可参考example 013
了解详情
重构组件
- 重构了
TimerTask
、GoTask
等基础组件,以提高coke::sleep
、coke::switch_go_thread
的性能,解决了v0.2.0版本中只可被取消的休眠任务
性能不符合预期的问题
Full Changelog: v0.2.0...v0.3.0
Workflow协程化的大厦已经落成,所剩的只是一些修饰工作,但在展望前景时发现,美丽而晴朗的天空却被两朵乌云笼罩了。第一朵乌云出现在对TCP全双工通信(如WebSocket, HTTP2)的支持上,第二朵出现在对通用TCP代理协议(如HTTPS, SOCKS5)的支持上。
v0.2.0
使用Coke v0.2.0
时建议依赖Workflow v0.11.3
版本。
新增组件
- 异步信号量
TimedSemaphore
- 异步锁
TimedMutex
- 异步共享锁
SharedTimedMutex
- 有向无环图任务
DagBuilder
、DagGraph
等,该组件很大程度上参考了google/marl,尤其是令我坚定了放弃在边上传递消息的信心
重构组件
- 使用可取消定时器机制重构了
Future
新增功能
- 增加
create_future(Task<T> &&task)
函数,启动一个协程任务task
并返回coke::Future
,后者可用于等待前者结束,类似于线程模式中的std::async
- 增加
QpsPool::get_if(unsigned count, const NanoSec &nsec)
,仅当可在nsec
时间内获取到count
个Qps许可时才产生等待任务,以解决某些场景下并发数远高于Qps时,一些协程等待过久的问题 - 休眠任务增加了只可被取消的类型,以
InfiniteDuration
参数标记,原则上来说应当比带时间的可取消休眠任务效率更高,但实际效率却更低,日后再做分析
Full Changelog: v0.1.0...v0.2.0
Coke Release v0.1.0
经过半年多的开发,Coke实现了大部分核心组件,Release v0.1.0
的发布,表明了开发工作进入下一阶段。请注意,在v1.0.0
发布前,可能会有在未升级主版本号时,接口发生不兼容改动的情况。
使用Coke v0.1.0
时建议依赖Workflow v0.11.1
版本。Coke
的更新可能会依赖Workflow
的新功能,此处会选择一个合理的版本作为建议,通常更高版本的Workflow
同样可以作为当前版本Coke
的依赖。