一、asyncio 解决了什么
Python 的 asyncio 用单线程事件循环实现并发,专为 IO 密集型任务设计:一个请求在等网络时,事件循环去跑别的协程,吞吐远超同步写法。
二、async / await 基本套路
import asyncio
async def fetch(name, sec):
print(f"{name} 开始")
await asyncio.sleep(sec) # 模拟 IO 等待,让出控制权
print(f"{name} 完成")
return name
async def main():
# 并发跑三个任务
results = await asyncio.gather(
fetch("A", 1), fetch("B", 2), fetch("C", 1)
)
print(results)
asyncio.run(main())
三、常见并发原语
| 原语 | 用途 |
|---|---|
| gather | 并发等一组任务全完成,拿全部结果 |
| create_task | 把协程提交给循环,立即返回 Task |
| Semaphore | 限制并发数,防打爆下游 |
| Queue | 生产者消费者模型 |
四、两个致命误区
- 在协程里调阻塞函数(如
time.sleep、同步 requests):会卡住整个事件循环,应改用asyncio.sleep或aiohttp; - 以为 asyncio 能加速 CPU 计算:不能,CPU 密集请上多进程。
五、限流示例
sem = asyncio.Semaphore(5) # 最多 5 个并发
async def safe_fetch(url):
async with sem:
async with aiohttp.ClientSession() as s:
async with s.get(url) as r:
return await r.text()
asyncio 上手不难,难在”别混用阻塞与异步”。守住这条,并发爬虫、并发 API 调用就能稳稳提速。