协程
协程
协程,又称微线程,纤程。英文名Coroutine。
优点1: 协程极高的执行效率。因为子程序切换不是线程切换,而是由程序自身控制,因此,没有线程切换的开销,和多线程比,线程数量越多,协程的性能优势就越明显。
优点2: 不需要多线程的锁机制,因为只有一个线程,也不存在同时写变量冲突,在协程中控制共享资源不加锁,只需要判断状态就好了,所以执行效率比多线程高很多。
因为协程是一个线程执行,那怎么利用多核CPU呢?最简单的方法是多进程+协程,既充分利用多核,又充分发挥协程的高效率,可获得极高的性能。
使用 生成器实现一个简单的协程过程
import time
def customer(name):
while 1:
bao_zi=yield
print(f"{name}吃{bao_zi}")
def producer():
v=1
c1.__next__()
c2.__next__()
while 1:
bao_zi =f"baozi{v}"
bao_zi2=f"baozi{v+1}"
print("包子出炉了")
time.sleep(1)
c1.send(bao_zi)
c2.send(bao_zi2)
v+=2
if __name__ == '__main__':
c1=customer("c1")
c2=customer("c2")
producer()
包子出炉了
c1吃baozi1
c2吃baozi2
包子出炉了
c1吃baozi3
c2吃baozi4
包子出炉了
c1吃baozi5
c2吃baozi6
包子出炉了
c1吃baozi7
c2吃baozi8
包子出炉了
c1吃baozi9
c2吃baozi10
协程的优点
优点如下:
1.协程的切换开销更小,属于程序级别的切换,操作系统完全感知不到,因而更加轻量级
2.单线程内就可以实现并发的效果,最大限度地利用cpu
缺点如下:
1.协程的本质是单线程下,无法利用多核,可以是一个程序开启多个进程,每个进程内开启多个线程,每个线程内开启协程
2.协程指的是单个线程,因而一旦协程出现阻塞,将会阻塞整个线程
总结协程特点:
1.必须在只有一个单线程里实现并发
2.修改共享数据不需加锁
3.用户程序里自己保存多个控制流的上下文栈
4.附加:一个协程遇到IO操作自动切换到其它协程(如何实现检测IO,yield、greenlet都无法实现,就用到了gevent模块(select机制))