一:什么是协程
协程(Coroutine):,又称微线程。协程是一种用户态的轻量级线程。是由用户自己控制,CPU根本不知道协程存在。
协程拥有自己的寄存器上下文和栈。
协程调度切换时,将寄存器上下文和栈保存在其他地方,在切回来的时候,恢复先前保存的寄存器上下文和栈
因此:协程能保留上一次调用的时的状态,每次过程重入时,就相当于进入上一次调用的。
换种说法:进入上一次离开时所处逻辑流的位置。
注意:线程切换会保存到CPU的寄存器里。
协程的标准:
1)必须在只有一个单线程里实现并发
2)修改共享数据不需要加锁
3)用户程序里自己保存从个控制流的上下文栈
4)一个协程遇到IO操作自动切换到其他协程
二:协程在什么时候切换
在什么时候进程切换:遇到I/O操作就切换,协程就是把io踢掉了(因为IO耗时)。
什么时候切回去: I0操作调用完了,通过调用callback切换回去
三:协程的优点缺点
优点:
1)无需线程上下文切换的开销
2)无需原子操作锁定及同步的开销(因为协程就是单线程,它就是串行,同一时间改数据只有一个线程)
3)方便切换控制流,简化编程模型
4)高并发+高扩展性+低成本:一个CPU支持上万的协程不是问题,很适合高并发
缺点:
1)无法利用多核资源:协程本质是单线程,他不能同时单个CPU的多个核用上,协程需要和进程配合
才能运行在多CPU上。
2)进行阻塞(Blocking)操作(如IO时)会阻塞整个程序
四:yield实现切换
# -*- coding:utf-8 -*- __author__ = 'shisanjun' import time import queue def consumer(name): print("------->starting eating baozi...") while True: new_baozi=yield print("[%s] is eating baozi %s" %(name,new_baozi)) def producer(): r=con.__next__() #con=consumer("c1")#只是生成生成器,不会执行,所以先要调用next才会开始执行 r=con2.__next__() n=0 while n <5: n+=1 con.send(n)#两个作业,唤醒生成器,并赋值 con2.send(n) print("