什么是生成器
- 可以生成值的函数
- 当一个函数有了yield关键字就成了生成器
- 可以挂起执行并保持当前执行状态的
def my_gen():
yield 'first'
yield 'second'
gen = my_gen()
print(next(gen))
print(next(gen))
基于生成器的协程
注:Python3前之前没有原生协程,只有基于生成器的协程
注:Python3.5后开始引入 async/await 支持原生协程
- 生成器可以通过yield暂停执行和产出数据
- 同时支持send()向生成器发送数据和throw()向生成器抛出异常
协程的注意点:
- 协程需要send(None)或者next(gen)来预激才能启动
- 在yield处协程会暂停执行
- 单独的yield value会把产出值给调用方
- 通过send发送值,值会赋予给yield的的左边变量
- 协程完成后会抛出StopIteration异常