飛龍博客

feilong.org

Python异步编程:asyncio库实战应用

(5) feilong.org 修订于2026-10-03 16:58:20 python教程

异步编程与asyncio简介
Python的asyncio库是实现异步编程的核心工具,它基于协程(coroutine)模型提供事件循环、任务调度和异步I/O支持。通过异步编程,开发者可以编写高并发、高性能的应用程序,尤其适用于网络请求、数据处理等IO密集型场景。

核心概念解析
1. async/await语法
- async定义协程函数,使其进入挂起状态
- await用于等待协程执行完成,释放CPU资源

python
async def fetch_data():
print("开始请求数据")
await asyncio.sleep(1) 模拟IO操作
print("数据获取成功")

python
async def main():
task1 = asyncio.create_task(fetch_data())
task2 = asyncio.create_task(fetch_data())
await task1
await task2

if name == "main":
asyncio.run(main()) Python 3.7+推荐方式

python
import aiohttp
import asyncio

async def fetch(session, url):
async with session.get(url) as response:
return await response.text()

async def main():
urls = ["https://example.com"] * 10 模拟10次请求
async with aiohttp.ClientSession() as session:
tasks = [fetch(session, url) for url in urls]
results = await asyncio.gather(*tasks)
print(f"获取{len(results)}个页面数据")

if name == "main":
asyncio.run(main())

性能对比:同步 vs 异步
通过计时器验证异步代码的优势,以10次HTTP请求为例:
- 同步模式(线性执行):约10秒
- 异步模式(并发执行):约1秒
> 说明:实际耗时受网络环境影响,但异步模型显著降低等待时间

最佳实践建议
1. 避免阻塞操作
- 将time.sleep()替换为asyncio.sleep()
- 使用aiofiles替代内置文件读写

2. 合理使用await

python
错误示例(导致线程阻塞)
await asyncio.sleep(1)
time.sleep(1) 阻塞主线程

python
async def safe_fetch(session, url):
try:
return await fetch(session, url)
except aiohttp.ClientError as e:
print(f"请求失败:{e}")
return None

常见问题解答
Q1: 如何处理阻塞代码?
- 使用loop.run_in_executor()将CPU密集型任务提交到线程池

Q2: 是否必须使用事件循环?
- asyncio.run()会自动创建和管理事件循环,但需注意版本兼容性

Q3: 协程与多线程的区别?
- 协程通过协作切换实现轻量级并发,而线程依赖操作系统调度,开销更大

结语
asyncio库为Python开发者提供了强大的异步编程能力。通过合理使用协程、事件循环和任务管理,可以显著提升IO密集型应用的性能。建议在实际项目中结合具体场景选择同步/异步模式,并持续关注Python官方文档更新以获取最新特性支持。

更新网址:https://feilong.org/python-asyncio-practical-guide
最初发布:20261003 04:58:20 feilong.org 于广州

加入收藏夹,查看更方便。

旧文:

python教程 更多

友链 更多

主机推荐

热门音乐

站内搜索