Python 异步编程与协程实战指南

为什么需要异步编程
在传统的同步阻塞模型中,程序必须等待一个操作(如网络请求、文件读写)完成后才能继续执行。对于高并发 IO 密集型任务,这种模式会导致大量线程资源浪费在等待上。
异步编程通过非阻塞机制,让程序在等待 I/O 完成时能切换去处理其他任务,从而显著提高执行效率并降低资源消耗。它特别适合网络通信、数据库查询及大文件操作等场景。
核心概念:协程与事件循环
什么是协程
协程(Coroutine)是轻量级的用户态线程,可以在执行过程中暂停和恢复。在 Python 中,使用 async def 定义协程函数,配合 await 关键字挂起当前任务。
import asyncio
async def hello():
print('Hello, World!')
await asyncio.sleep(1)
print('Hello again!')
注意这里使用了 await,它告诉解释器'在这里暂停,把控制权交还给事件循环',直到睡眠结束再恢复执行。
事件循环的作用
事件循环是异步编程的心脏,负责调度任务的执行。它会不断从任务队列中取出待运行的协程,分配 CPU 时间片,并在遇到 await 时切换到下一个任务。
获取并运行事件循环的常用方式如下:
import asyncio
loop = asyncio.get_event_loop()
async def hello():
print('Hello, World!')
await asyncio.sleep(1)
print('Hello again!')
# 推荐直接使用 asyncio.run() 启动新的事件循环
asyncio.run(hello())
虽然可以直接调用 loop.run_until_complete(),但在现代 Python 版本中,asyncio.run() 更加简洁且安全。
任务调度与管理
在实际开发中,我们通常需要同时运行多个协程。asyncio 提供了丰富的工具来管理这些任务。
创建与并发执行
使用 asyncio.create_task() 可以将协程包装成任务对象,实现并发执行。


