Python 异步编程与协程实战指南
在 I/O 密集型任务中,传统同步代码往往因为等待网络响应或文件读写而阻塞主线程。Python 的异步编程模型通过协程(Coroutine)和事件循环(Event Loop),让程序在等待期间能处理其他任务,从而大幅提升并发效率。
核心概念解析
什么是协程
协程是一种轻量级的线程,可以在执行过程中暂停并恢复状态。在 Python 3.5+ 中,我们使用 async def 关键字定义协程函数,并在其中使用 await 挂起当前任务。
import asyncio
async def hello():
print('Hello, World!')
await asyncio.sleep(1)
print('Hello again!')
注意,定义协程并不会立即执行它,只有将其交给事件循环运行才会开始。
事件循环的作用
事件循环是异步编程的心脏,负责调度任务的执行。它会不断从任务队列中取出待执行的协程,一旦遇到 await 就切换到下一个任务,直到所有任务完成。
获取并运行事件循环的典型方式如下:
import asyncio
loop = asyncio.get_event_loop()
async def hello():
print('Hello, World!')
await asyncio.sleep(1)
print('Hello again!')
loop.run_until_complete(hello())
在现代 Python 版本中,推荐使用 asyncio.run() 来简化这一过程,它会自动创建和管理事件循环。
任务调度与管理
在实际开发中,我们通常需要同时管理多个异步任务。asyncio 提供了丰富的工具来处理任务的创建、取消和超时控制。
创建与并发执行
使用 asyncio.create_task() 可以将协程包装成 Task 对象,实现并发执行。asyncio.gather() 则能批量收集多个任务的结果。
import asyncio
async def count():
print('Counting...')
await asyncio.sleep(1)
()
():
asyncio.gather(count(), count(), count())
asyncio.run(main())


