Python 异步:asyncio 基础使用指南
·
Python 异步:asyncio 基础使用指南
1. 异步编程核心概念
- 事件循环:异步程序的核心引擎,负责调度和执行协程
- 协程 (Coroutine):通过
async def定义的异步函数,用await挂起非阻塞操作 - 任务 (Task):对协程的封装,由事件循环调度执行
- Future:低层级对象,表示异步操作的最终结果
2. **基础语法结构
import asyncio
# 定义协程
async def say_after(delay, message):
await asyncio.sleep(delay) # 非阻塞等待
print(message)
# 主协程
async def main():
print("开始执行")
# 创建任务并发执行
task1 = asyncio.create_task(say_after(1, "你好"))
task2 = asyncio.create_task(say_after(2, "世界"))
# 等待任务完成
await task1
await task2
print("执行结束")
# 启动事件循环
asyncio.run(main())
3. 关键API解析
asyncio.run(coro):启动事件循环的入口函数asyncio.create_task(coro):将协程包装为任务并调度asyncio.sleep(delay):异步延时(不阻塞线程)asyncio.gather(*tasks):并发运行多个任务
async def concurrent_tasks():
results = await asyncio.gather(
task_coroutine(1),
task_coroutine(2),
task_coroutine(3)
)
print(f"结果集: {results}")
4. **异步I/O操作示例
async def fetch_data(url):
reader, writer = await asyncio.open_connection(url, 80)
request = f"GET / HTTP/1.1\r\nHost: {url}\r\n\r\n"
writer.write(request.encode())
await writer.drain()
data = await reader.read(1000)
writer.close()
return data.decode()
async def main():
data = await fetch_data("example.com")
print(f"收到 {len(data)} 字节数据")
5. 最佳实践要点
- 避免阻塞调用:在协程内禁用
time.sleep()等阻塞操作 - 任务管理:使用
asyncio.TaskGroup()(Python 3.11+) 管理任务生命周期 - 错误处理:通过
try/except捕获协程内的异常 - 资源释放:用
async with管理异步上下文(如网络连接)
6. **同步 vs 异步性能对比
# 同步版本(耗时约6秒)
def sync_version():
time.sleep(2)
time.sleep(4)
# 异步版本(耗时约4秒)
async def async_version():
task1 = asyncio.create_task(asyncio.sleep(2))
task2 = asyncio.create_task(asyncio.sleep(4))
await task1
await task2
关键总结:
- 使用
async/await声明协程- 通过
asyncio.run()启动事件循环- 用
create_task()实现并发执行- I/O密集型场景性能提升显著
- 避免在协程中混用同步阻塞代码
更多推荐



所有评论(0)