返回笔记
基础概念

Python 异步编程:async/await 从入门到实战

Python 异步 async await asyncio FastAPI

FastAPI 的底层就是 Python 异步编程。理解了 async/await,才能写出高性能的 Web 应用。

同步 vs 异步

同步代码像一个人在收银台:一次只能服务一个顾客,其他人都等着。异步代码像餐厅服务员:点完单就去服务下一桌,厨房做好了再来上菜,不会让任何人干等。

关键概念

  • 协程:用 async def 定义的函数,可以暂停和恢复
  • 事件循环:调度所有协程的"大管家",决定谁先执行
  • await:挂起当前协程,让事件循环去做其他事,等结果回来再继续

基本用法

import asyncio

async def fetch_data():
    await asyncio.sleep(1)  # 模拟网络请求
    return "数据获取完毕"

async def main():
    # 并发执行 3 个请求,总耗时约 1 秒,而不是 3 秒
    results = await asyncio.gather(
        fetch_data(),
        fetch_data(),
        fetch_data(),
    )
    print(results)

asyncio.run(main())

在 FastAPI 中的实践

@app.get("/users/{user_id}")
async def get_user(user_id: int):
    # async 数据库查询,不阻塞其他请求
    user = await db.fetch_one("SELECT * FROM users WHERE id = $1", user_id)
    return user

FastAPI 的 async 路由让服务器能同时处理大量请求,而不是一个接一个。

常见坑

  • 不要在 async 函数里调同步阻塞代码:会卡死整个事件循环
  • CPU 密集型操作用线程池:异步只管 I/O,不管计算
  • 记得 await:忘记 await 只会拿到一个 coroutine 对象,不会执行
  • 不要在 async 里直接调 requests:用 httpx 或 aiohttp 替代