- 协程是为非抢占式多任务产生子程序的计算机程序组件。
- 协程允许不同入口点在不同位置暂停或开始执行程序。可以从技术上理解协程是一个可以随时中断执行的函数。
- 实现协程比较有名的包有asyncio,tornado,gevent
- 协程的实现:
- yield返回值
- send调用
- 同时协程还需要next()进行预激
- 概括协程的实现过程:首先定义一个协程(可通过在函数中使用yield),其次生成一个协程(本质是生成器),进行预激(通过next()),主协程通过send()给变量赋值,逐步执行,直到抛出StopIteration异常。
# 协程代码案例
def simple_coroutine():
print('-> start')
x = yield
print('-> received',x)
# 主线程
sc = simple_coroutine() # 先生成一个协程(生成器)
print(1111)
# 可以使用sc.send(None),效果一样
next(sc) # 预激,本案例中执行了协程,执行到yield为止
print(2222)
sc.send('hahahh')
-
协程的四个状态
- inspect.getgeneratorstate(…) 函数确定协程的状态,该函数会返回下述字符串中的一个:
- GEN_CREATED:等待开始执行
- GEN_RUNNING:解释器正在执行
- GEN_SUSPENED:在yield表达式处暂停
- GEN_CLOSED:执行结束
-
协程终止
- 协程中未处理的异常会向上冒泡,传给next函数或send方法的调用方(即触发协程的对象)
- 如果想中途终止协程,发送某个哨符值,让协程退出。协程执行的每一步,判断是否哨符值是否是退出标志。内置的 None 和Ellipsis 等常量经常用作哨符值。
- 如果为了得到返回值,那么协程必须正常终止,而不是抛出其他异常的终止。如果协程正常终止,生成器会发出StopIteration异常,异常对象的value属性保存返回值(return 后的值)。
-
yield from
- yield from从内部捕获StopIteration异常。
- yield from功能类似于一个通道。主线程给yield from 传值(send()),然后yield from 直接又传值给协程。返回值的时候,协程先把值返回给yield from,然后yield from在把返回值返回给主线程。
-
委派生成器
- 包含yield from 表达式的生成器函数就是委派生成器
- 委派生成器在yield from表达式处暂停,调用方可以直接把数据发给子生成器
- 子生成器在把产出的值发给调用方
- 子生成器在最后,解释器会抛出StopIteration,并且把返回值附加到异常对象上
注:本文是本人根据北京图灵学院的python课程自己整理的笔记哒,转载请注明出处哈~