Python 异步编程 async 处理规则
这篇笔记围绕 Python 异步服务中哪些操作该 await、哪些不能指望 async 加速这一边界展开,适合在 FastAPI 等事件循环模型下处理接口、数据库、缓存、对象存储和本地计算任务的开发者参考。文章先强调网络 I/O 本身不消耗 CPU,调用 OpenAI、数据库、Redis、S3 等等待型操作时,应使用 httpx、asyncpg、motor 等异步库并显式 await,让主线程在等待网络返回时继续处理其他请求。随后区分 CPU/内存密集任务:Pandas 处理 Excel、视频转码、哈希计算或超长循环即使写进 async def,也仍会占用主线程并卡住 Event Loop,协程语法不会把单线程计算变成并行计算。针对这类阻塞,文章给出两类“扔到池子里”的处理方式:优先用 asyncio.to_thread 或线程池释放事件循环,尤其适合 Excel 解析、图片处理和许多 Pandas/Numpy 操作,因为其底层 C 实现可能在重计算或 I/O 时释放 GIL。对于纯 Python 重计算,文中建议使用 ProcessPoolExecutor 绕开 GIL,但同时提醒进程创建、序列化传输和无法共享内存都会带来更高成本。最后还提供了一个 AsyncWrapper 示例,用 __getattr__ 将同步厂商 SDK 方法统一包装成 await asyncio.to_thread(...) 的异步调用形式,用较小线程切换开销换取异步服务对旧同步接口的兼容。


