Coke是基于C++ Workflow和C++ 20实现的协程框架,专为高性能异步任务设计。受益于C++ 20提供的协程特性,Coke提供了简洁直观的异步编程接口,开发者可以使用同步的编码风格创造出异步的高性能应用。
- ⚡️ 性能出众:继承
C++ Workflow的高效架构,支持海量并发和高吞吐场景 - 🚀 高效抽象:基于
C++20协程,在极低开销下提供友好的开发体验 - 🔗 无缝集成:完全兼容
C++ Workflow生态,可在协程和任务流之间自由切换 - 📝 组件丰富:实现了异步锁、异步条件变量、Qps限制器等诸多基础组件
- 🌐 易于扩展:已经为HTTP、Redis、MySQL协议提供支持,用户为
Workflow扩展的协议也可方便地转为协程
每隔一秒向标准输出打印一次Hello World。
#include <iostream>
#include <chrono>
#include "coke/wait.h"
#include "coke/sleep.h"
coke::Task<> say_hello(std::size_t n) {
std::chrono::seconds one_sec(1);
for (std::size_t i = 0; i < n; i++) {
if (i != 0)
co_await coke::sleep(one_sec);
std::cout << "Hello World" << std::endl;
}
}
int main() {
coke::sync_wait(say_hello(3));
return 0;
}使用coke::RedisClient发起读写请求,并输出结果。
#include <iostream>
#include "coke/coke.h"
#include "coke/redis/client.h"
void show_result(const coke::RedisResult &res)
{
if (res.get_state() == coke::STATE_SUCCESS)
std::cout << res.get_value().debug_string() << std::endl;
else
std::cout << "RedisFailed state:" << res.get_state()
<< " error:" << res.get_error() << std::endl;
}
coke::Task<> redis_cli()
{
coke::RedisClientParams params;
params.host = "127.0.0.1";
params.port = "6379";
params.password = "your_password";
coke::RedisClient cli(params);
coke::RedisResult res;
// setex key 100 value
res = co_await cli.setex("key", 100, "value");
show_result(res);
// mget key nokey
res = co_await cli.mget("key", "nokey");
show_result(res);
// del key
res = co_await cli.del("key");
show_result(res);
}
int main()
{
coke::sync_wait(redis_cli());
return 0;
}同时发起三个休眠任务,并等待执行完成。
#include <iostream>
#include <vector>
#include "coke/coke.h"
coke::Task<> sleep()
{
co_await coke::sleep(1.0);
std::cout << "Sleep 1 second finished.\n";
}
int main()
{
std::vector<coke::Task<>> tasks;
for (int i = 0; i < 3; i++)
tasks.emplace_back(sleep());
coke::sync_wait(std::move(tasks));
return 0;
}请前往example目录继续阅读。
需要完整支持C++ 20 coroutine功能的编译器
- 若使用GCC编译器,建议
GCC >= 13,至少GCC >= 11 - 若使用Clang编译器,建议
Clang >= 18,至少Clang >= 15
构建时依赖编译器和openssl,单元测试部分依赖gtest,根据实际情况按需安装依赖项。
-
Ubuntu 24.04/22.04
apt install gcc g++ libgtest-dev libssl-dev git cmake
-
Fedora
dnf install gcc gcc-c++ gtest-devel openssl-devel git cmake
-
CentOS Stream 10/9
dnf install gcc gcc-c++ openssl-devel git cmake
可通过下述方式安装gtest
dnf install epel-release dnf install gtest-devel
此处以coke v0.6.0和workflow v0.11.11为例,从github下载源代码
git clone --branch v0.6.0 https://github.com/kedixa/coke.git
cd coke
git clone --branch v0.11.11 https://github.com/sogou/workflow.git或从gitee下载源代码
git clone --branch v0.6.0 https://gitee.com/kedixa/coke.git
cd coke
git clone --branch v0.11.11 https://gitee.com/sogou/workflow.git- cmake参数
-j 8表示编译时开启8个并发,如果有更多的cpu核心,可以指定一个更大的数。 - 选项
-D COKE_ENABLE_EXAMPLE=1表示构建示例,选项-D COKE_ENABLE_TEST=1表示构建单元测试。
cmake -S workflow -B build.workflow -D CMAKE_CXX_STANDARD=20
cmake --build build.workflow -j 8
cmake -S . -B build.coke -D Workflow_DIR=workflow -D CMAKE_CXX_STANDARD=20 -D COKE_ENABLE_EXAMPLE=1 -D COKE_ENABLE_TEST=1
cmake --build build.coke -j 8
# 执行测试
ctest --test-dir build.coke/test/
# 体验示例
./build.coke/example/helloworldWorkflow中有些任务创建时可以指定名称,例如具名WFTimerTask可以根据名称被取消、具名WFCounterTask可以根据名称唤醒、具名WFGoTask可以根据名称区分计算队列等。Coke保留所有以coke:开始的名称,以满足自身使用。
Apache 2.0