1. 异步编程革命:事件循环驱动
事件循环(Event Loop) 是asyncio的引擎,在单线程内调度协程执行。当协程遇到IO阻塞时,立即切换至其他就绪任务,实现"并发假象":
import asyncio
async def main():
print("Start")
await asyncio.sleep(1) # 非阻塞挂起
print("End")
asyncio.run(main()) # 事件循环入口
2. 协程与任务:异步执行单元
协程(Coroutine) 通过async def定义,配合await交出控制权。任务(Task) 则包装协程实现并发:
async def fetch_data(url):
print(f"Fetching {url}")
await asyncio.sleep(2) # 模拟网络请求
return f"Data from {url}"
async def main():
# 创建并发任务
task1 = asyncio.create_task(fetch_data("url1"))
task2 = asyncio.create_task(fetch_data("url2"))
# 等待所有任务完成
results = await asyncio.gather(task1, task2)
print(f"Received: {results}")
asyncio.run(main())
3. 异步IO混合操作实战
组合网络请求与文件写入,展示异步生态集成:
import aiohttp # 需安装第三方库
import aiofiles
async def download_and_save(url):
async with aiohttp.ClientSession() as session:
async with session.get(url) as response:
data = await response.text()
async with aiofiles.open("output.txt", "w") as f:
await f.write(data[:100]) # 写入前100字符
return f"Saved {url}"
async def main():
urls = ["https://python.org", "https://example.com"]
tasks = [download_and_save(url) for url in urls]
await asyncio.gather(*tasks)
asyncio.run(main())
4. 性能对比与选型指南
|
场景类型 |
同步耗时 |
异步耗时 |
提升倍数 |
|
100次网络请求 |
20s+ |
~2s |
10x |
|
混合IO操作 |
15s+ |
~1.5s |
10x |
|
CPU密集型计算 |
无优势 |
可能更慢 |
- |
最佳实践:
- 优先用于HTTP服务/数据库访问等IO场景
- 避免在协程内执行阻塞型CPU操作
- 使用
run_in_executor融合线程池处理阻塞调用 - 监控任务状态:
asyncio.all_tasks()获取活动任务
异步编程彻底改变了Python处理高并发的范式。通过本文的深度解析和实用示例,开发者可掌握利用asyncio构建高性能应用的核心技能,在Web服务、爬虫系统等场景中实现质的飞跃。
92

被折叠的 条评论
为什么被折叠?



