yield关键字
yield关键字是python中用于处理协程的关键字,其含义为产出和让步。yield item这行代码会产出一个值,提供给next(…)的调用方,同时,还会做出让步,暂停执行生成器,让调用方继续工作,指导需要使用另一个值时再调用next()。
简单的使用
def simple_coroutine():
print('-> coroutine started')
x = yield
print('->coroutine recieved:', x)
上述函数是yield关键字的一个最为简单的使用,该函数调用方式如下:
> my_coro = simple_coroutine()
> next(my_coro)
-> coroutine started
> my_coro.send(42)
-> coroutine recieved: 42
Traceback(most recent call last):
...
StopIteration
最后一行抛出StopIteration异常是因为控制权流到了协程定义体的结尾,生成器会抛出该异常,利用该异常可以得知协程运行结束。
协程状态
协程运行时会经历以下四个状态:
‘GEN_CREATED’
‘GEN_RUNNING’
‘GEN_SUSPENDED’
‘GEN_CLOSED’
分别对应着,等待开始执行、解释器正在执行、在yield吧表达式处暂停、执行结束四个状态。next方法在协程等待开始执行时调用,使协程进入执行状态,send方法只能在协程暂停时地调用,其传入的参数将会赋值给yield等号前的变量,yield后的变量的值将会作为send的返回值返回。
使用协程可以实现一些需要异步处理的代码功能。
yield from关键字
yield from是一种全新的语言结构,其功能比yield关键字强大的多。它的主要作用是,在生成器gen中使用yield from subgen()时,subgen会获得控制权,把产出的值传给gen的调用方,即调用方可以直接控制subgen。与此同时,gen会阻塞,等待subgen终止。yield from关键字在这里起到的作用相当于是中间人的作用,将其他函数的yield传递出来进行组合,以实现更加复杂的功能。