Skip to content

Releases: kedixa/coke

v0.4.1

01 Jan 09:23
f38f33f
Compare
Choose a tag to compare

使用Coke v0.4.1时必须依赖Workflow v0.11.6及以上版本。

新增功能

  1. 移除了对异常的强依赖,可在禁用异常的情况下编译coke,但coke/tools未实现该功能
  2. coke::Future增加cancel接口,关联的coke::Promise需要通过is_canceled主动获取该状态,并决定是否要取消当前任务

新增组件

  1. coke::SyncGuardWFGlobal::sync_operation_beginWFGlobal::sync_operation_end进行了封装
  2. coke::ScopeExit,通用的作用域防护组件
    可在<experimental/scope>进入标准库前用于实现类似的功能

修复问题

  1. 修复容器queuedeque对内存分配器约束错误的问题

其他

  1. 增加了许多文档,仅网络和文件IO部分尚未完成
  2. 增加了示例019-021
  3. 支持使用bazel 8.0构建当前项目

v0.4.0

28 Oct 15:59
7f7af41
Compare
Choose a tag to compare

使用Coke v0.4.0时必须依赖Workflow v0.11.6及以上版本。

不兼容改动

TimedSemaphoreTimedMutexTimedSharedMutexTimedCondition组件重命名为SemaphoreMutexSharedMutexCondition。在最初的构想中,包含Timed名称的组件基于计时器timer实现,可以支持try_lock_forwait_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);
}

考虑到简洁的名称应当留给更通用的组件,故做此不兼容的名称修改。

新增功能

  1. 当未捕获的异常逃逸至被detach的协程时,将其激活后再终止进程,便于在调试器中获取异常类型
  2. coke可等待对象可以在其他协程框架中使用;其他协程框架的可等待对象不可直接在coke框架中调用,这是因为同一个coke::Task中的所有任务都运行在同一个SeriesWork中,异步等待其他协程会破坏这种约定
  3. coke::MySQLConnection支持复用connection id,以避免RouteResult数量持续增长的问题
  4. coke::PriorityQueue支持仅可移动构造和赋值的对象,但要求移动时不可抛出异常

新增组件

  1. Go语言用户常见的组件coke::WaitGroup
  2. 异步锁包装器coke::UniqueLockcoke::SharedLock

移除组件

  1. 移除coke::GenericAwaiter<T>,可直接使用coke::BasicAwaiter<T>

v0.3.0

10 Aug 07:32
Compare
Choose a tag to compare

使用Coke v0.3.0时建议依赖Workflow v0.11.5版本。

新增功能

  1. 支持指定默认SeriesWork创建器
    • 当一个SubTaskcoke协程当中被启动时,若当前协程没有关联的SeriesWork,会使用用户指定的SeriesWork创建器创建一个SeriesWork
  2. 支持在coke协程间传递异常,若被detach的协程结束时包含未被处理的异常,会调用std::terminate终止进程;coke::Future支持捕获异常
  3. 增加coke::create_future函数以支持通过coke::TaskSeriesWork创建器来创建coke::Future对象
  4. 增加coke::wait_futurescoke::wait_futures_for函数,支持等待指定数量的coke::Future就绪
  5. coke::sleep支持以用户指定的void *addr进行休眠任务,并通过coke::cancel_sleep_by_addr取消尚未结束的休眠任务,相比通过unique id的方式可以少保存一个整数,而唯一的addr可使用生命周期长于休眠任务的全局或局部变量的地址

新增组件

  1. 条件变量coke::TimedCondition
  2. 异步容器coke::Queuecoke::PriorityQueuecoke::Stackcoke::Deque
  3. 命令行参数解析器coke::OptionParser
    • 该组件的诞生,使cokeexamplebenchmark部分不再依赖getopt.h,在任意支持workflow >= 0.11.3C++ 20的平台上均可以完整构建coke
  4. 同步门闩coke::SyncLatch
  5. coke::StopToken,在前台协程和后台协程间传递停止事件的工具,可参考example 013了解详情

重构组件

  1. 重构了TimerTaskGoTask等基础组件,以提高coke::sleepcoke::switch_go_thread的性能,解决了v0.2.0版本中只可被取消的休眠任务性能不符合预期的问题

Full Changelog: v0.2.0...v0.3.0

Workflow协程化的大厦已经落成,所剩的只是一些修饰工作,但在展望前景时发现,美丽而晴朗的天空却被两朵乌云笼罩了。第一朵乌云出现在对TCP全双工通信(如WebSocket, HTTP2)的支持上,第二朵出现在对通用TCP代理协议(如HTTPS, SOCKS5)的支持上。

v0.2.0

24 Mar 06:55
57e97cc
Compare
Choose a tag to compare

使用Coke v0.2.0时建议依赖Workflow v0.11.3版本。

新增组件

  1. 异步信号量TimedSemaphore
  2. 异步锁TimedMutex
  3. 异步共享锁SharedTimedMutex
  4. 有向无环图任务DagBuilderDagGraph等,该组件很大程度上参考了google/marl,尤其是令我坚定了放弃在边上传递消息的信心

重构组件

  1. 使用可取消定时器机制重构了Future

新增功能

  1. 增加create_future(Task<T> &&task)函数,启动一个协程任务task并返回coke::Future,后者可用于等待前者结束,类似于线程模式中的std::async
  2. 增加QpsPool::get_if(unsigned count, const NanoSec &nsec),仅当可在nsec时间内获取到count个Qps许可时才产生等待任务,以解决某些场景下并发数远高于Qps时,一些协程等待过久的问题
  3. 休眠任务增加了只可被取消的类型,以InfiniteDuration参数标记,原则上来说应当比带时间的可取消休眠任务效率更高,但实际效率却更低,日后再做分析

Full Changelog: v0.1.0...v0.2.0

Coke Release v0.1.0

09 Dec 14:48
d0417fe
Compare
Choose a tag to compare

经过半年多的开发,Coke实现了大部分核心组件,Release v0.1.0的发布,表明了开发工作进入下一阶段。请注意,在v1.0.0发布前,可能会有在未升级主版本号时,接口发生不兼容改动的情况。

使用Coke v0.1.0时建议依赖Workflow v0.11.1版本。Coke的更新可能会依赖Workflow的新功能,此处会选择一个合理的版本作为建议,通常更高版本的Workflow同样可以作为当前版本Coke的依赖。