async/await原理与协程类型详解
请解释Python中async/await语法的底层原理。什么是协程(coroutine)?coroutine function、coroutine object、awaitable的区别是什么?async def和普通generator有什么本质不同?async generator和async iterator又如何工作?
回答
编译有声
async def定义协程函数,调用时返回协程对象。协程本质是基于生成器的状态机——每个await点是一个yield点,事件循环驱动其执行。
协程类型(Python 3.5+):
coroutine function:async def定义的函数 → 调用后返回coroutine对象coroutine object:可await执行,通过send(None)驱动awaitable:实现了__await__()的对象,包括coroutine、Task、Future
vs Generator:
- 生成器:
yield产出值,可迭代 - 协程:
await等待另一个协程,不可直接迭代 - 协程内部有
__await__协议,yield from在协程中等价于await
async generator(Python 3.6+):
async def async_range(n):
for i in range(n):
await asyncio.sleep(0.1)
yield i # async generator
使用async for消费,返回AsyncGeneratorType。
async iterator:实现__aiter__和__anext__,用于async for。
本质差异:普通生成器是同步的惰性序列,而协程和异步生成器需要事件循环驱动。