传统多线程在 IO 密集场景开销大、易出错。Python 的 asyncio 用协程实现"单线程并发",特别适合网络请求、数据库查询等 IO 等待型任务。
一、核心概念
- 协程:用
async def定义的函数,可暂停可恢复 - 事件循环:调度协程的核心,负责在 IO 等待时切换任务
- await:暂停当前协程,让出控制权给事件循环
二、对比同步与异步
# 同步:三个请求串行,共需 3 秒
import requests
for url in urls:
requests.get(url) # 每个 1 秒
# 异步:三个请求并发,约 1 秒
import asyncio, aiohttp
async def fetch(url):
async with aiohttp.ClientSession() as s:
async with s.get(url) as r:
return await r.text()
async def main():
await asyncio.gather(*[fetch(u) for u in urls])
asyncio.run(main())
异步的收益来自 IO 等待时间的重叠。如果是纯 CPU 计算,异步没有优势,反而该用多进程。
三、常见陷阱
- 忘记
await:得到的是协程对象而非结果 - 在异步代码里调用同步阻塞函数(如 requests):会卡住整个事件循环
- 混用 asyncio 和多线程:要注意线程安全
四、小结
asyncio 是 Python 处理高并发 IO 的现代方案。学习曲线略陡,但掌握后能写出高效的网络程序。推荐配合 aiohttp、httpx 等异步库使用。