python协程概念
什么是协程
协程是单线程下的并发,又称微线程,纤程。它是实现多任务的另一种方式,只不过是比线程更小的执行单元。因为它自带CPU的上下文,这样只要在合适的时机,我们可以把一个协程切换到另一个协程。英文名Coroutine。一句话说明什么是协程:在一个线程中的某个函数中,我们可以在任何地方保存当前函数的一些临时变量等信息,然后切换到另外一个函数中执行,注意不是通过调用函数的方式做到的 ,并且切换的次数以及什么时候再切换到原来的函数都由开发者自己确定。
线程和协程的区别:
线程的切换是一个cpu在不同线程中来回切换,是从系统层面来,不止保存和恢复CPU上下文这么简单,会非常耗费性能。但是协程只是在同一个线程内来回切换不同的函数,只是简单的操作CPU的上下文,所以耗费的性能会大大减少。
需要强调的是:
- python的线程属于内核级别的,即由操作系统控制调度(如单线程遇到io或执行时间过长就会被迫交出cpu执行权限,切换至其他线程运行)
- 单线程内开启协程,一旦遇到io,就会从应用程序级别(而非操作系统)控制切换,以此来提升效率(!!!非io操作的切换与效率无关)
对比操作系统控制线程的切换,用户在单线程内空盒子协程的切换有以下优缺点:
优点: - 协程的切换开销更小,属于程序级别的切换,操作系统完全感受不到,因而更加轻量级
- 单线程内就可以实现并发的效果,最大限度地利用cpu
缺点: - 协程的本质是单线程下,无法利用多核,可以是一个程序开启多个进程,每个进程内开启多个线程,每个线程内开启协程
- 协程指的是单个线程,因而一旦协程出现阻塞,将会阻塞整个线程
python协程模块-Gevent使用
Gevent是一个第三方库,可以轻松通过gevent实现并发同步或异步编程,在gevent中用到的主要模式是Greenlet。示例如下:
import gevent
g1 = gevent.spawn(func,1,2,3,x=4,y=5)func后都是参数
g2 = gevent.spawn(func2)
g1.join() #等待g1结束
g2.join() #或者上述两步合作一步:
gevent.joinall([g1,g2])
g1.value #拿到func1的返回值