Python的asyncio库是Python 3.4版本引入的一个库,用于编写单线程并发代码,它提供了一种新的编程模型,使得异步I/O和并行处理变得更加容易。
在传统的并发模型中,线程和进程是常见的并发单位,但是它们都有一些限制,例如线程的创建和切换开销较大,而进程之间的通信和共享数据比较困难。而asyncio库提供了一种基于事件循环的并发模型,它以协程作为并发单元,通过异步I/O操作和回调函数来实现并发。
在asyncio库中,最重要的概念是事件循环(Event Loop)。事件循环是一个循环执行的抽象事件队列,它负责调度协程的执行,以及处理异步I/O操作。在asyncio中,使用async和await关键字来定义协程,并使用asyncio.run()函数来启动事件循环,进而执行协程。
asyncio基本概念
-
协程(Coroutine):协程是一种特殊的函数,它使用
async def
定义,并且可以在内部使用await
来挂起执行,等待异步操作完成。 -
事件循环(Event Loop):事件循环是
asyncio
的核心,它负责运行协程,处理 I/O 事件,以及调度任务。 -
Future:表示一个尚未完成的异步操作。
-
Task:是 Future 的一个子类,用于封装协程对象,使其可以被事件循环调度。
-
异步 I/O:指的是非阻塞的 I/O 操作,可以在等待 I/O 完成时进行其他操作。
import asyncio
# 定义一个协程
async def hello():
print('Hello')
await asyncio.sleep(1) # 模拟异步操作,例如 I/O 操作
print('World')
# 定义另一个协程
async def greet(name):
await asyncio.sleep(0) # 让出控制权,等待其他协程运行
print(f'Hello {name}')
# 主函数,用于启动事件循环
async def main():
task1 = asyncio.create_task(hello()) # 创建任务
task2 = asyncio.create_task(greet('Kimi')) # 创建任务
# 等待所有任务完成
await task1
await task2
# 运行主函数,启动事件循环
asyncio.run(main())
在这个示例中,我们定义了两个协程 hello()
和 greet()
。hello()
协程打印 "Hello",然后等待 1 秒,再打印 "World"。greet()
协程立即让出控制权,等待其他协程运行,然后打印问候语。
main()
函数是程序的入口点,它创建了两个任务,并通过 await
等待它们完成。最后,使用 asyncio.run(main())
启动事件循环并运行 main()
函数。
这个示例展示了 asyncio
的基本用法,包括定义协程、创建任务、以及如何使用事件循环来调度和运行协程。
有哪些常用异步库?
搭配协程和asyncio,有一些常用的库,以下是一些例子:
-
aiohttp
:这是一个异步web请求库,可以用来发送HTTP请求和处理HTTP响应。你可以使用它来爬取网页或者进行其他基于HTTP的异步操作。 aiomysql
:这是一个异步数据库连接库,可以用来连接和操作MySQL数据库。你可以使用它来执行数据库查询和操作,而不会阻塞主程序的其他部分。asyncio
:这是Python的标准库,提供了异步编程的基本工具和接口。你可以使用它来创建协程,调度协程的执行,以及处理异步操作的结果。subprocess
:这是Python的标准库,提供了创建和管理子进程的功能。你可以使用它来在后台运行其他程序或命令,而不会阻塞主程序的其他部分。aiofiles
:这是一个异步文件操作库,可以用来异步地读写文件。你可以使用它来读取或写入大文件或网络文件,而不会阻塞主程序的其他部分。
这些库都是为了配合asyncio和协程的使用而设计的,可以帮助你更高效地编写异步代码,处理异步操作,以及进行各种异步任务。
这些库都说 a 开头的,表示异步的意思。