简洁
前一篇博客介绍了libfiber里使用协程的简单方法,这里介绍下调度协程的三种方式
自动调度,立即执行
这种模式下,创建的协程会被立即执行,协程结束后才返回创建处的代码逻辑。
void schedule_two(void) {
acl::fiber::init(acl::FIBER_EVENT_T_KERNEL, true); //指定事件类型,自动调度,注意第二个参数
for (int i = 0; i < 10; i++) {
go[&] { fiber1(i); };
printf("after create fiber-%d\n", i);
}
}
在这种模式下,最顶层的代码同一时刻只能创建一个协程,协程结束后再创建另一个。但是可以在协程里继续创建子协程。等所有协程都消亡后,才返回主业务流程。
先指定事件类型,最后统一调度
本模式下创建完所有协程后才调度。
void schedule_bench(int nfiber, int nloop) {
acl::fiber::init(acl::FIBER_EVENT_T_KERNEL, false); //指定事件类型,但是不自动调度,注意第二个参数
long long count = 0;
for (int i = 0; i < nfiber; i++) {
go[&] { fiber2(nloop, count); };
}
printf("scheduleing\r\n\n");
acl::fiber::schedule(); //调度协程
}
创建完毕后统一指定支持的事件类型并调度
这种写法和上面那种等效。
void schedule_one(void) {
std::vector<acl::fiber*> fibers;
for (int i = 0; i < 10; i++) {
go[&] { fiber1(i); };
}
acl::fiber::schedule_with(acl::FIBER_EVENT_T_KERNEL); //调度协程
}
上述代码先创建一批协程,然后才开始调度,并指定支持的事件类型。
总结
我个人感觉最后一种最简洁,也最常用。
参考资料
libfiber的贡献者爱奇艺的技术分享:爱奇艺网络协程编写高并发应用实践
ACL作者介绍libfiber的博客:acl开发–协程篇