写异步 Python 的人很多,真正把事件循环、Future/Task、async/await 的底层机制搞清楚的人却不多。多数人停留在「加个 async def、用 await 调用」的层面,一旦遇到「为什么我的协程没并发」「为什么 Task 泄漏」「为什么 uvloop 反而更慢」这类问题就束手无策。本文从事件循环的调度本质讲起,一直讲到 uvloop 与 aiohttp 在生产环境的高并发实践,力求把每个结论都落到可运行、可验证的代码与参数上。
一、事件循环:单线程里的「协作式调度器」
asyncio 的核心是一个事件循环(Event Loop)。它本质上是一个运行在单线程里的协作式调度器,通过 select/epoll/kqueue 等 I/O 多路复用机制,在一个线程内同时「监听」成千上万个 socket。
2025/2/15大约 8 分钟