Skip to content

CofeCore/coroutine

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

36 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

coroutine

简介

简单的单线程协程,支持协程池、协程并发调度等能力。在 IO 密集型任务中使用协程收益是最大的,能大幅度减少程序的耗时,测试其效率有几倍到十几倍的提升;但不推荐在 CPU 密集型任务中使用。

环境

操作系统:Linux (建议内核 2.6 以上),支持 x86_64 架构; 编译器:需要支持 C++11 或更高标准的编译器(如 g++ 5+ 或 clang 5+)

编译

支持 bazelcmake 两种编译方式

  • 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 中提供了一系列的基本的创建协程任务函数,如:AddCoroTaskAddTimeout ,可创建多个协程任务也可在协程任务中嵌套创建协程任务,最后通过 CoroutineRun 运行并等待所有的协程任务结束。

coro_pool.h 中提供了协程池,可以通过 PoolTaskRun 更加方便的同步运行需要执行的任务,不需要再手动调用 CoroutineRun。不仅如此,使用协程池通过 PoolBatchAddTaskPoolBatchTaskRun 能够手动加入多个任务且并发的执行,这对业务中执行多个无上下文关联的 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);
	......
}

About

简单的协程,支持协程池、协程并发调度等能力。

Resources

License

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published