协程
协程又称为微线程,协程是一种用户态的轻量级线程
协程拥有自己的寄存器和栈。协程调度切换的时候,将寄存器上下文和栈都保存到其他地方,在切换回来的时候,恢复到先前保存的寄存器上下文和栈,因此:协程能保留上一次调用状态,每次过程重入时,就相当于进入上一次调用的状态。
协程的好处:
1.无需线程上下文切换的开销(还是单线程)
2.无需原子操作(一个线程改一个变量,改一个变量的过程就可以称为原子操作)的锁定和同步的开销
3.方便切换控制流,简化编程模型
4.高并发+高扩展+低成本:一个cpu支持上万的协程都没有问题,适合用于高并发处理
缺点:
1.无法利用多核的资源,协程本身是个单线程,它不能同时将单个cpu的多核用上,协程需要和进程配合才能运用到多cpu上(协程是跑在线程上的)
2.进行阻塞操作时会阻塞掉整个程序:如io
使用yield实现协程的例子:
import time import queue def consumer(name): print("---->start eating baozi......") while True: #yield默认可以返回数据,走到yield整个程序返回,yield被唤醒的时候还可以接收数据 #进入死循环碰到yield暂停,被唤醒的时候才执行print new_baozi = yield print("[%s] is eating baozi %s" %(name,new_baozi)) #time.sleep(2) def producer(): #__next__()调用消费者的next,consumer直接调用的话,第一次不会执行,会变成一个生成器 #函数如果里面有yield第一次加括号调用,他是一个生成器,还没有真正执行,__next__()才会执行 r = con.__next__() r = con2.__next__() n = 0 while n<5: n += 1 #send有两个作用:唤醒生成器的同时,传送一个值,传的这个值就是yield接收到的值new_baozi con.send(n) con2.send(n)
#time.sleep(1) print("