对协程的理解

对于操作系统来说,协程其实是一种特殊的线程,对于CPU来说,协程是非抢占式(进程和线程是抢占式的),实现机理如下:

有两个function:A, B, A调用B,B要执行一段时间,很晚才返回,A不会因为等B而一直占用CPU,即A是非阻塞的。B返回后,A又能继续执行。神奇的是,A和B又是走在一条独木桥(桥上并行只能走一条线程或者进程)上的,即A和B是一体的(和线程,进程同一级别)。那么有人会问,B要执行很久,B不就阻塞了吗,既然AB一体,B阻塞,不就是A阻塞吗?重要的来了:B是阻塞的,但是B并不是阻塞CPU,B阻塞的是除了CPU以外的资源,比如硬盘(慢)。所以,AB并不会阻塞CPU。这里,AB就是协程。

比较一下线程,又有两个function:C,D,C执行很快,D要去读硬盘,那么如果CD一体,是一个线程,那么C一定会等D(因为线程是CPU抢占式的),那么CD就是堵塞的了。

所以,可以看到,协程适合用在多IO,比如Web后台,每个用户来了都要读数据库,我们不能让每个用户来到离开一直占领着CPU,这时候用协程就解决了。

这时,又有人说了,可以用多线程来实现AB啊。是可以,但是多线程就涉及到共享冲突的问题,最经典的是生产者消费者模型。


贴来一段别人比较好的解释:

Coroutine,翻译成”协程“,初始碰到的人马上就会跟进程和线程两个概念联系起来。直接先说区别,Coroutine是编译器级的,Process和Thread是操作系统级的。Coroutine的实现,通常是对某个语言做相应的提议,然后通过后成编译器标准,然后编译器厂商来实现该机制。Process和Thread看起来也在语言层次,但是内生原理却是操作系统先有这个东西,然后通过一定的API暴露给用户使用,两者在这里有不同。Process和Thread是os通过调度算法,保存当前的上下文,然后从上次暂停的地方再次开始计算,重新开始的地方不可预期,每次CPU计算的指令数量和代码跑过的CPU时间是相关的,跑到os分配的cpu时间到达后就会被os强制挂起。Coroutine是编译器的魔术,通过插入相关的代码使得代码段能够实现分段式的执行,重新开始的地方是yield关键字指定的,一次一定会跑到一个yield对应的地方。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值