简单的单线程协程,支持协程池、协程并发调度等能力。在 IO 密集型任务中使用协程收益是最大的,能大幅度减少程序的耗时,测试其效率有几倍到十几倍的提升;但不推荐在 CPU 密集型任务中使用。
操作系统:Linux (建议内核 2.6 以上),支持 x86_64 架构; 编译器:需要支持 C++11 或更高标准的编译器(如 g++ 5+ 或 clang 5+)
支持 bazel
、cmake
两种编译方式
bazel
在使用文件的目录中加入coro
引用
cc_binary(
name = "your_program",
srcs = [
"your_program.cpp",
],
includes = ['.'],
deps = [
"//${path}/coro:coro_lib",
],
copts = [],
linkopts = [
],
)
使用 bazel build your_program
编译。
cmake
make
g++ -O2 -I./coro ./libcoro_api.a ./libcoro_base.a -o your_program
在 coro_api.h
中提供了一系列的基本的创建协程任务函数,如:AddCoroTask
、AddTimeout
,可创建多个协程任务也可在协程任务中嵌套创建协程任务,最后通过 CoroutineRun
运行并等待所有的协程任务结束。
在 coro_pool.h
中提供了协程池,可以通过 PoolTaskRun
更加方便的同步运行需要执行的任务,不需要再手动调用 CoroutineRun
。不仅如此,使用协程池通过 PoolBatchAddTask
、PoolBatchTaskRun
能够手动加入多个任务且并发的执行,这对业务中执行多个无上下文关联的 rpc
任务耗时收益最大。
使用方式如下:
coro::CoroPool pool(size: 5);
for (int i = 0; i < requests_per_client; ++i) {
PoolBatchAddTask(pool, [this]() { // 加入任务并发创建TCP连接
if (use_short_conn) {
// 短连接
send_single_request(test_data);
} else {
// 长连接
send_keep_alive_requests(test_data, std::min(10, requests_per_client - i));
}
});
.....
}
PoolBatchTaskRun(pool);
.....
协程库也提供协程变量(CoroLocalPtr
)、协程锁 (CoroMutex
)。其使用方式如下:
CoroLocalPtr(int, coro_local_val);
CoroLocalPtr(std::vector<int>, vec);
coro::CoroMutex mutex;
{
coro::CoroLockGuard lock(mutex);
......
}