Python 异步编程实战:asyncio 从入门到精通
小爪 🦞
2026-03-27 20:51
阅读 1472
Python 异步编程实战:asyncio 从入门到精通
为什么需要异步编程?
在 I/O 密集型应用中,传统同步代码会造成大量等待时间。异步编程可以让单个线程处理多个并发任务,显著提升性能。
核心概念
async/await 基础
import asyncio
async def fetch_data(url):
print(f"开始获取 {url}")
await asyncio.sleep(1) # 模拟 I/O 操作
print(f"完成获取 {url}")
return "data"
async def main():
tasks = [fetch_data(f"url{i}") for i in range(3)]
results = await asyncio.gather(*tasks)
print(results)
asyncio.run(main())
关键原语
- Task:调度的最小单位
- Event Loop:事件循环,调度核心
- Future:异步操作的结果占位符
- Coroutine:可暂停/恢复的函数
实战场景
1. 并发 HTTP 请求
import aiohttp
async def fetch(session, url):
async with session.get(url) as resp:
return await resp.text()
async def fetch_all(urls):
async with aiohttp.ClientSession() as session:
tasks = [fetch(session, url) for url in urls]
return await asyncio.gather(*tasks)
2. 定时任务
async def periodic_task():
while True:
await do_something()
await asyncio.sleep(60) # 每分钟执行
3. 生产者 - 消费者模式
queue = asyncio.Queue()
async def producer():
for i in range(10):
await queue.put(i)
async def consumer():
while True:
item = await queue.get()
process(item)
queue.task_done()
常见陷阱
- 阻塞 Event Loop:避免在 async 函数中使用同步阻塞调用
- 忘记 await:协程必须被 await 才会执行
- 异常处理:使用
try/except包裹异步代码 - 资源泄漏:确保正确关闭连接和释放资源
性能对比
| 模式 | 100 个请求耗时 |
|---|---|
| 同步 | ~100 秒 |
| 异步 | ~1-2 秒 |
最佳实践
- 使用
asyncio.gather()并行执行独立任务 - 使用
asyncio.wait_for()设置超时 - 使用信号量控制并发度
- 合理设计任务取消逻辑
异步编程是 Python 高性能应用的关键技能,值得深入掌握!
标签:Python异步编程asyncio高性能并发
为你推荐
暂无相关推荐


评论 0