你是不是写过这样的代码:
import time
time.sleep(2) # 程序卡住2秒,啥也干不了
这叫同步阻塞——程序在傻等。
如果这2秒是网络请求、读文件,完全可以先去干别的事,等结果回来再继续。
async 就是帮你做到这一点的。
async 是什么?
一句话:让函数可以“暂停等待”,同时让 Python 去执行其他任务。
await → 在异步函数内部等待一个操作完成,期间不阻塞
最简单的例子
import asyncio
asyncdefsay_hello():
print("开始")
await asyncio.sleep(1) # 模拟异步 I/O
print("1秒后结束")
asyncio.run(say_hello())
注意:不能用 time.sleep(1),那会卡死整个程序。必须用 await asyncio.sleep。
并发执行多个任务(核心价值)
同步版:3个任务,分别耗时3、2、1秒 → 总耗时 6秒
import time
deftask(n, sec):
time.sleep(sec)
print(f"任务{n}完成")
start = time.time()
task(1, 3)
task(2, 2)
task(3, 1)
print(time.time() - start) # 约6秒
异步版:用 asyncio.gather 同时跑 → 总耗时 3秒(等于最慢那个)
import asyncio
asyncdeftask(n, sec):
await asyncio.sleep(sec)
print(f"任务{n}完成")
asyncdefmain():
await asyncio.gather(
task(1, 3),
task(2, 2),
task(3, 1),
)
asyncio.run(main()) # 输出顺序 3→2→1,总耗时3秒
什么时候用 async?
✅ 适合:网络爬虫、Web接口、数据库查询、读写文件(I/O密集)
❌ 不适合:大量数学计算、图像处理(CPU密集)——那种要用多进程
两个最容易犯的错
忘了 await
asyncdefget():
return42
result = get() # 错:result是个协程对象,不是42
result = await get() # 对
在异步函数里用 time.sleep
要用 await asyncio.sleep
总结
| |
|---|
async def | |
await | |
asyncio.run() | |
asyncio.gather() | |
一句话记忆:
async 让程序在等待时不傻等,await 是“我先歇会儿,好了叫我”。
试试把 time.sleep 换成 await asyncio.sleep,你会打开新世界的大门 🚪