协程的多线程切换

本文探讨了在协程应用中如何避免因单个协程阻塞而导致整个调度器阻塞的问题。通过将可能引起阻塞的操作放入其他线程执行,并在完成后再切换回协程,确保程序的高性能和流畅运行。示例代码展示了协程如何在多个线程间进行切换以保留执行顺序。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

通常,协程主调度器管理着本线程中所有的协程,并依次调度这些协程运行,在一个协程执行完之后,需要将执行权限交给调度器,即进行 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_db_conn在其他线程执行完毕时,再切换到这个协程,并且能够接着exe_non_block2继续执行,那么我们就可以解决上边提出的问题, 保证整个主调度器不会阻塞,即便某一个协程中需要进行阻塞操作,我们也可以把这段会阻塞的代码放到其他线程中取执行,等执行完成后,再切换回来。换句话说,就是需要协程有这样的特性:

能够按照代码顺序依次在多个线程中执行
那么,协程有这样的特性吗? 很幸运,协程是有的,因为在每次交出执行权限(即<

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值