asyncio
是 Python 标准库中的一个库,用于实现 异步 I/O 和 协程 的并发编程。它提供了事件循环、任务调度、异步 I/O 操作等功能,特别适用于 I/O 密集型任务(如网络请求、文件操作)而非 CPU 密集型任务。
与 gevent
类似,asyncio
通过 协程(coroutines
)进行并发任务调度,但它不依赖于自动打补丁的方式,而是通过显式使用 await
和 async
关键字来实现异步操作。
核心概念与功能
-
协程 (Coroutine):
- 通过
async def
定义一个协程函数,使用await
关键字来等待其他协程完成。 - 协程是
asyncio
的核心概念,用于并发执行任务而不需要使用线程或进程。
- 通过
-
事件循环 (Event Loop):
asyncio
的并发模型基于事件循环,通过事件循环来调度多个协程的执行。- 一个程序通常有一个全局事件循环,可以通过
asyncio.run()
或asyncio.get_event_loop()
来启动事件循环。
-
任务 (Task):
- 通过
asyncio.create_task()
可以调度协程并并发执行任务。 - 每个任务代表一个独立的执行单元,任务之间通过事件循环来进行切换。
- 通过
-
异步 I/O:
asyncio
提供了很多异步 I/O 操作,比如文件、网络连接、数据库查询等。通过使用await
来处理 I/O 操作,程序可以在 I/O 操作的等待过程中执行其他任务。
基本使用示例
import asyncio
async def task_1():
print('Task 1 start')
await asyncio.sleep(2)
print('Task 1 end')
async def task_2():
print('Task 2 start')
await asyncio.sleep(1)
print('Task 2 end')
async def task_3():
print('Task 3 start')
await asyncio.sleep(0.5)
print('Task 3 end')
async def main():
# 创建任务并发执行
tasks = [
asyncio.create_task(task_1()),
asyncio.create_task(task_2()),
asyncio.create_task(task_3())
]
# 等待所有任务完成
await asyncio.gather(*tasks)
# 启动事件循环并执行协程
asyncio.run(main())
重要概念
-
async/await:
async
用于定义异步函数(协程),await
用于等待异步操作完成。协程的执行是非阻塞的,遇到await
时,会暂停当前协程,等待资源可用。
-
事件循环 (Event Loop):
- 事件循环是
asyncio
的核心,它负责管理协程的调度和执行。可以通过asyncio.run()
启动一个事件循环,并在其中执行异步任务。
- 事件循环是
-
任务 (Task):
- 任务是由协程创建的执行单元,它会在事件循环中并发执行。使用
asyncio.create_task()
创建一个任务后,任务会立即开始执行,但并不会阻塞事件循环。
- 任务是由协程创建的执行单元,它会在事件循环中并发执行。使用
-
同步与异步 I/O:
asyncio
的异步 I/O 函数(如asyncio.sleep()
和asyncio.open_connection()
)允许在等待 I/O 完成时让出控制权,使得其他协程可以在此期间运行。
使用场景
- 网络 I/O 密集型任务:如 Web 服务器、爬虫、WebSocket 服务器、数据库查询。
- 异步文件操作:可以使用异步函数处理大量文件 I/O。
- 并发任务调度:用于并发执行大量的小任务。
与 gevent
的对比
特性 | asyncio | gevent |
---|---|---|
核心概念 | 基于事件循环的协程 (async/await) | 基于 Greenlets 的协程 |
标准库支持 | 是 | 否 |
依赖外部库 | 否 | 需要安装 gevent |
I/O 操作 | 需要显式地用 await | 通过 monkey-patch 自动处理 |
使用复杂度 | 需要用 async 和 await 管理 | 相对简单,封装程度更高 |
适用场景 | 网络 I/O,文件操作等 | 主要用于 I/O 密集型任务 |
任务调度 | 显式调度,通过 create_task | 自动调度 |
常用函数
-
asyncio.run():启动事件循环并执行协程。
asyncio.run(main())
-
asyncio.create_task():创建一个异步任务,使得协程能够并发运行。
task = asyncio.create_task(coroutine_func())
-
asyncio.gather():等待多个协程并发执行并返回结果。
results = await asyncio.gather(task1, task2, task3)
-
asyncio.sleep():异步睡眠,暂停当前协程并让出控制权。
await asyncio.sleep(seconds)
事件循环管理
# 创建事件循环
loop = asyncio.get_event_loop()
# 执行协程直到完成
loop.run_until_complete(main())
asyncio
是现代 Python 中进行并发编程的首选工具,尤其适用于网络应用、异步 I/O 操作和高并发任务。通过显式的 async/await
语法,使得代码逻辑更加清晰,虽然需要编写更多的模板代码,但能带来强大的并发能力。