协程为什么要设置成非阻塞io

前言

以前一直认为协程是在read 、 write前先yield让出协程,等待数据到来就resume回来,进行之后的处理,假设使用阻塞io,我只需要在eventloop中的epoll_wait设置timeout依然能够实现异步,所以io是否阻塞对整个协程没有关系(反正在你阻塞前都要让出去的嘛),但这两天写代码的时候仔细想了想发现这种想法是错误的,协程必须使用非阻塞io。

原因

产生如上想法的本身是因为没有考虑到程序存在多线程的情况,当阻塞io执行epoll_wait的时候,当前这个线程会从用户态切换到核心态,并在操作系统内部挂起,这样操作系统就回去执行其他的线程了,那么这个挂起线程里万一有协程超时或者数据处理完毕就没办法继续执行了,得等到epoll_wait超时回到用户态,并且操作系统把cpu切换回这个线程才能执行。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值