Python 的协程能力脱胎于生成器,yield 关键字从单纯的值产出逐步演化为双向通信与异步调度的基础。
一、生成器的双向通信
python
def accumulator():
total = 0
while True:
value = yield total
if value is None:
break
total += value
acc = accumulator()
next(acc) # 启动生成器,返回 0
acc.send(10) # 返回 10
acc.send(5) # 返回 15send() 将值传入生成器,yield 既产出值又接收值,这构成了协程的雏形。
二、从 yield from 到 async/await
yield from 简化了生成器委托,PEP 380 引入后成为 await 的语义前身。PEP 492 正式引入 async def 与 await,将协程从生成器中分离为独立类型,使事件循环能够清晰区分普通生成器与可等待对象。