asyncio 是 Python 的一个用于编写单线程并发代码的库,使用 async/await 语法。它是 Python 3.4 中引入的一个功能,主要用于解决异步IO编程的问题,也是 Python 中处理并发的一个重要方式。
以下是一些基本概念和用法:
-
Coroutine(协程):在 Python 中,协程是一种特殊的函数,它可以在执行过程中挂起(yield),然后在之后的某个时间点再从挂起的地方继续执行。这种特性使得协程非常适合用于处理IO密集型任务。在 Python 中,协程函数用
async def关键字定义,返回一个协程对象。async def foo(): print('Running in coroutine') -
Event Loop(事件循环):事件循环是 asyncio 的核心。它负责调度并执行任务。你可以想象它是一个无限循环,不断检查和执行任务。
import asyncio async def foo(): print('Running in coroutine') # 创建事件循环 loop = asyncio.get_event_loop() # 将协程添加到事件循环 loop.run_until_complete(foo()) # 关闭事件循环 loop.close() -
Task(任务):任务是对协程对象的进一步封装,它提供了一些额外的功能,比如获取协程的执行结果,取消协程的执行等。在事件循环中执行协程时,通常会将协程封装成任务来执行。
import asyncio async def foo(): return 'Running in coroutine' # 创建任务 task = asyncio.create_task(foo()) # 获取任务结果 print(task.result()) -
Future(期程):期程是 asyncio 中的一个重要概念,它代表一个尚未完成的操作。当这个操作完成后,期程会存储其结果或者错误信息。你可以在期程完成后获取其结果,或者添加一个回调函数,在期程完成后自动执行。
import asyncio async def foo(): return 'Running in coroutine' loop = asyncio.get_event_loop() future = loop.create_future() # 绑定回调函数 future.add_done_callback(lambda x: print('Done')) # 在协程中设置future的结果 async def set_future_result(): await asyncio.sleep(1) future.set_result('Future is done!') loop.run_until_complete(set_future_result()) loop.close() -
async/await:这是定义和调用协程的关键字。
async def用于定义协程函数,await用于在协程中等待另一个协程完成。import asyncio async def foo(): await asyncio.sleep(1) print('Running in coroutine') asyncio.run(foo()) -
gather和wait:这两个函数都用于在一个协程中等待多个协程完成。区别是,
gather会返回所有协程的结果,而wait只会返回完成的协程。import asyncio async def foo(n): await asyncio.sleep(n) return 'Done ' + str(n) # gather print(asyncio.run(asyncio.gather(foo(1), foo(2), foo(3)))) # wait done, pending = asyncio.run(asyncio.wait([foo(1), foo(2), foo(3)])) print([task.result() for task in done])
这只是 asyncio 库的基本介绍,它还有很多其他的功能和用法。