一、一些基本概念:
协程(Coroutine),又称微线程,纤程,一种用户级的轻量级线程。
栈(Stack)是一个数据集合,可以理解为只能在一端进行插入或删除操作的列表。
协程拥有自己的寄存器上下文和栈,协程调度切换时,将寄存器上下文和栈保存到其他地方,在切回来的时候,恢复先前保存的寄存器上下文和栈。因此:协程能保留上一次调用时的状态(即所有局部状态的一个特定组合),每次过程重入时,就相当于进入上一次调用的状态。
在并发编程中,协程与线程类似,每个协程表示一个执行单元,有自己的本地数据,与其他协程共享全局数据和其他资源
协程需要用户自己来编写调度逻辑,对于CPU来说,协程其实是单线程,所以cpu不用去考虑怎么调度,切换上下文,这就省去了cpu的切换开销,所以协程一定程度上又好于多线程
协程存在的意义:对于多线程应用,CPU通过切片的方式来切换线程间的执行,线程切换时需要耗时(保存状态,下次继续)。协程,则只使用一个线程,在一个线程中规定某个代码块执行顺序。
协程的适用场景:当程序中存在大量不需要CPU的操作时(IO),适用于协程;
二、yield回顾:
def f(): print('ok1') count=yield 5 print(count) print('ok2') yield 6 gen=f() # ret=next(gen) # print(ret) ret=gen.send(None) print(ret) ret2=gen.send(7) #7赋值给count。 print(ret2) output: ok1 5 7 ok2 6
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
#__author: greg1617 #date: 2017/9/22 9:21 def consumer(name): print("--->starting eating baozi...") while True: new_baozi = yield print("[%s] is eating baozi %s" % (name, new_baozi)) # time.sleep(1) def producer(): r = con.__next__()# 等于next(con) r = con2.__next__()# 等于next(con2) n = 0 while n < 5: n += 1 con.send(n) con2.send(n) print("