参考:https://www.cnblogs.com/zhangyux/p/6195860.html
参考:廖雪峰 协程 gevent
IO密集型任务指的是磁盘IO或者网络IO占主要的任务,计算量很小,比如请求网页,读写文件等。===========读写文件,socker receive/send
计算密集型任务指的是CPU计算占主要的任务,比如图形渲染中矩阵的运算(当然现在都用GPU来完成)
因为协程是用户自己来编写调度逻辑的,对CPU来说,协程其实是单线程,所以CPU不用去考虑怎么调度、切换上下文,这就省去了CPU的切换开销,所以协程在一定程度上又好于多线程。
gevent是基于IO切换的协程,使用gevent,可以获得极高的并发性能,但gevent只能在Unix/Linux下运行,在Windows下不保证正常安装和运行。
Python通过yield
提供了对协程的基本支持,但是不完全。而第三方的gevent为Python提供了比较完善的协程支持。
gevent是第三方库,通过greenlet实现协程,其基本思想是:
当一个greenlet遇到IO操作时,比如访问网络,就自动切换到其他的greenlet,等到IO操作完成,再在适当的时候切换回来继续执行。由于IO操作非常耗时,经常使程序处于等待状态,有了gevent为我们自动切换协程,就保证总有greenlet在运行,而不是等待IO