asyncio
是 Python 3.4 引入的标准库,是一个基于事件循环的异步 I/O 并发库。它提供了一种协作式的多任务处理方式,使得我们能够在一个线程中并发处理多个 I/O 操作。它通过将 I/O 操作转化为异步的非阻塞调用,从而实现了高效的并发处理。其原理如下:
-
定义协程(coroutine):使用关键字
async def
定义一个协程函数,它是一种特殊的函数,可以暂停执行并在稍后恢复执行。 -
创建一个事件循环(event loop):事件循环是一个无限循环,它不断地等待事件的发生并处理这些事件。在事件循环中,我们可以注册协程、定时器和回调函数等事件。
-
启动事件循环:调用事件循环的
run_until_complete()
方法,将协程注册到事件循环中并启动事件循环。 -
在协程中使用
await
:使用关键字await
可以暂停当前协程的执行,等待另一个协程或异步操作完成后再恢复执行。
下面是一个使用 asyncio
实现异步框架程序的示例,创建一个任务列表,列表中有 100 个任务,每个任务是返回一个数字,数字从 0 开始。
import asyncio
async def get_number(n):
await asyncio.sleep(1) # 模拟耗时操作
return n
async def main():
tasks = []
for i in range(100):
tasks.append(asyncio.create_task(get_number(i)))
numbers = await asyncio.gather(*tasks)
print(numbers)
if __name__ == '__main__':
asyncio.run(main())
上述代码中,我们定义了一个 get_number()
协程函数,它模拟一个耗时操作并返回一个数字。然后我们在 main()
协程中创建了一个包含 100 个任务的任务列表,每个任务都是调用 get_number()
函数。最后,我们使用 asyncio.gather()
方法等待所有任务完成,并打印出所有数字。在最后,我们使用 asyncio.run()
函数来启动事件循环。这个示例程序使用 asyncio
实现了一个简单的异步框架,可以在一个线程中同时处理多个 I/O 操作,提高程序的并发能力。