第一次研究协程,仅做学习记录,如果有不对的地方,还望各位不吝赐教,多谢。
什么是协程(Coroutine)?
协程,又称微线程。是一种可以在函数内部中断并返回的一种特殊函数,它和普通函数不同在于,普通函数只有一个入口,一个出口(return),必须从上至下顺序执行。协程会通过yield保存函数的数据和状态,并将函数挂起,待到再次激活时,从上次挂起的地方继续执行。
协程有什么优势?劣势呢?
优势
1.协程最大的优势是执行效率非常高,因为都是在同一线程中进行,就避免了切换线程的开销,所以和多线程相比,线程越多协程的优势越明显。
2.协程不需要多线程的锁机制,因为只有一个线程,就不存在同时写变量的冲突,在协程中控制共享资源不加锁,只需要判断状态就好,所以效率比多线程也高很多。
劣势
由于python的GIL机制(同一时刻,同一cpu只允许有一个线程在执行),所以无法充分利用多核CPU,造成资源上的浪费。
当然,前人都已经帮我们想好了,使用多进程+协程就可以解决这个问题。
多进程可以充分利用多核CPU,这就避免了GIL的限制,同时也能发挥协程的高效率,可以获得极高的性能。
gevent
gevent是第三方库。
通过greenlet实现协程,其基本思想是:
当一个greenlet遇到IO操作时,比如访问网络,就自动切换到其他的greenlet,等到IO操作完成,再在适当的时候切换回来继续执行。由于IO操作非常耗时,经常使程序处于等待状态,有了gevent为我们自动切换协程,就保证总有greenlet在运行,而不是等待IO。
本来想直接学习gevent的,由于gevent是基于greenlet实现,所以打算另开一篇博客学习greenlet,传送门
未完待续...