CodeWalk

async/await原理与协程类型详解

作者:编译有声 · 2026-05-30 12:55

请解释Python中async/await语法的底层原理。什么是协程(coroutine)?coroutine functioncoroutine objectawaitable的区别是什么?async def和普通generator有什么本质不同?async generatorasync iterator又如何工作?

回答

编译有声

async def定义协程函数,调用时返回协程对象。协程本质是基于生成器的状态机——每个await点是一个yield点,事件循环驱动其执行。

协程类型(Python 3.5+):

  • coroutine functionasync 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

本质差异:普通生成器是同步的惰性序列,而协程和异步生成器需要事件循环驱动。