传统的 Python 编程通常采用同步阻塞模式。在面对大量 I/O 密集型任务(如网络爬虫、API 请求、文件读取)时,同步代码会让 CPU 处于空闲等待状态,极大限制了程序效率。
asyncio 是 Python 原生支持的异步编程库,旨在通过单线程和事件循环(Event Loop)并发处理数以千计的 I/O 操作。本文将带你用最短的时间理解并上手 Python 异步开发。
核心概念三要素
async/await关键字:- 用
async def定义的函数称为协程函数(Coroutine Function),调用它会返回一个协程对象,而不会直接执行其内部代码。 - 使用
await挂起耗时 I/O 任务,让出 CPU 执行权,使其他协程能够继续运行。
- 用
- 事件循环(Event Loop):
- 异步应用的核心调度器,负责监听和循环分发协程任务,并在挂起的 I/O 准备就绪时恢复执行协程。
- 可等待对象(Awaitables):
- 可以在
await表达式中使用的对象,通常包括协程、任务(Tasks)和 Future 对象。
- 可以在
实战:同步 VS 异步并发
我们模拟一个需要调用多个网络接口的场景,每个网络调用大约耗时 1.5 秒。
传统的同步写法:
1 | import time |
- 同步执行耗时:约 4.5 秒(任务依次排队执行)。
高效的 asyncio 异步并发写法:
1 | import asyncio |
- 异步并发耗时:约 1.5 秒!所有任务几乎在同一时间启动,并在等待期间交出了 CPU 控制权。
总结要点
- 在异步协程函数中,绝不能使用任何传统的同步阻塞库(如原生的
time.sleep()或同步的requests请求库)。必须使用其对应的异步替代版本(如asyncio.sleep()或aiohttp/httpx库),否则整个事件循环会被彻底阻塞,失去异步的意义。 - 使用
asyncio.run()启动整个事件循环,并且仅在主入口函数调用一次即可。