协程介绍

先了解进程和线程:

让计算机能够同时处理多个任务,操作系统有了进程的概念,而且在进程内部,基本可以认为当前系统只有一个进程在运行,操作系统对此作了非常好的封装。进程间的切换是由操作系统来完成的。

进程有一个问题,就是进程间切换耗费计算机资源非常大,而且申请一个新的进程的成本也非常高。所以后来就有了线程,它生成的成本和切换的消耗都比进程要低很多,而且线程间通信也非常方便。

线程的问题是:

1)存在线程安全问题,出了问题非常不易定位。

2)进程内部有线程数目的限制。

3)随着并发量的增加,线程生成和切换的成本也变得昂贵。

 

看看协程是如何解决这些问题的:

1)协程的生成成本更低。其实就是一块内存,记录之前的调用的栈信息。你甚至可以通过控制函数调用的层次来进一步降低协程的大小。要生成一个协程,只需要申请一块内存并赋值。

2)切换更快。基本是就是内存的拷贝的速度。

3)没有线程安全问题。一个进程内可以同时存在多个协程,但是只有一个协程是激活的,而且协程的激活和休眠时程序员通过编程来控制,而不是内核来控制的。这样就没有了线程安全问题。

4)可读性更好。相对于IO多路复用来说,你调用的服务接口或者IO接口是异步的,但是你的代码是流畅(顺序)的,并没有被异步和回调打乱。协程也是异步的,但是它会把异步的事件和回调封装起来,形成类似远程调用接口。


Python的协程实现:

yield可以实现协程。另外,还有很多第三方的版本,比如greenlet。


协程可以用来做什么?

1)描述逻辑:我主要把协程用来描述逻辑。一个流程可能需要调用多个接口,其中很多接口是异步的。这样描述起来会困难一点。用线程是可以解决部分问题,但是复杂度提升。

2)提高并发:主要应用在IO密集型应用中。gevent就是在greenlet基础之上的一个处理并发的框架,和上面的区别是,这里的事件及接口是IO接口。


缺陷:

无法使用多核。不过可以通过进程+协程来解决。


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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值