协程的多线程切换

我们知道,在一个基于协程的应用程序中,可能会产生数以千记的协程,所有这些协程,会有一个的调度器来统一调度。
另外我们知道,高性能的程序首要注意的就是避免程序阻塞。那么,在以协程为最小运行单位的程序中,同样也需要确保这一点,即每一个协程都不能发生阻塞。因为只要某一个协程发生了阻塞,那么整个调度器就阻塞住了,后续等待的协程得不到运行,整个程序此时也将死翘翘了。那么,如果需要保证任意一个协程都不阻塞,该怎么做呢?

通常,协程主调度器管理着本线程中所有的协程,并依次调度这些协程运行,在一个协程执行完之后,需要将执行权限交给调度器,即进行 yield 操作,以便调度器能够调度后续等待运行的协程。如果在某个协程内,含有阻塞操作,如打开数据库连接:

exe_non_block1();
open_db_conn(...);
exe_non_block2(); 

如上边代码所示,先执行了exe_non_block1, 然后打开一个数据库连接,之后再执行exe_non_block2, 如果对这段代码不做任何处理,倘若打开数据库连接需要耗时很多,那么在这期间,整个程序就阻塞住了,这种情况是绝对不能容许的。怎么解决呢?

我们看,先执行了exe_non_block2, 然后执行open_db_conn, 如果能够把open_db_conn这个函数调用放到其他的线程中去执行,同时本协程yield,交出执行权限;之后,当open

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值