Python 异步编程与协程实战指南
在 I/O 密集型任务中,同步阻塞往往成为性能瓶颈。异步编程允许程序在等待网络或文件操作时继续处理其他逻辑,从而显著提升吞吐量。本文将深入探讨 Python 中的协程、事件循环以及 asyncio 和 aiohttp 库的实战应用。
为什么需要异步编程
传统的同步代码在执行耗时操作(如 HTTP 请求)时会挂起当前线程,导致资源浪费。异步模式通过非阻塞机制,让单个线程能并发处理多个任务。其核心优势在于:
- 提升效率:I/O 等待期间不占用 CPU 时间片。
- 降低开销:相比多线程,协程切换成本极低。
- 简化结构:避免回调地狱,代码更接近同步写法。
常见场景包括高并发 Web 服务、批量数据抓取及实时通信等。
理解协程:轻量级并发单元
协程(Coroutine)是 Python 异步编程的基础。使用 async def 定义的函数即为协程函数,调用它不会立即执行,而是返回一个协程对象。真正的执行需要通过事件循环调度。
import asyncio
async def hello():
print('Hello, World!')
await asyncio.sleep(1)
print('Hello again!')
注意 await 关键字,它表示在此处暂停协程,将控制权交还给事件循环,直到 sleep 完成。若需同时运行多个协程,可使用 asyncio.gather:
async def count():
print('Counting...')
await asyncio.sleep(1)
print('Counted!')
async def main():
await asyncio.gather(count(), count(), count())
asyncio.run(main())
任务调度与管理
在实际开发中,我们常需要将协程包装为任务(Task),以便更灵活地控制生命周期。
创建与取消任务
使用 asyncio.create_task 可以将协程注册到事件循环中,使其后台运行。若需提前终止,可调用 task.cancel()。
import asyncio
async def ():
:
()
asyncio.sleep()
()
asyncio.CancelledError:
()
():
task = asyncio.create_task(hello())
asyncio.sleep()
task.cancel()
:
task
asyncio.CancelledError:
()
asyncio.run(main())


