5.1 Event Loop
现在简要讲讲异步的第二部分,它总是无处不在:事件循环 (Event Loop),任务 (Task) 和 Future。
想象一下Event Loop是乐团指挥,Task是音乐家,而Future是音乐家要演奏的乐谱。指挥(Event Loop)协调音乐家(Task)的工作,他们根据乐谱(Future)演奏音乐(异步操作)。
事件循环 (Event Loop) 是Python中 异步编程的基础。它负责执行异步任务、管理事件和 处理输入输出。事件循环不断检查新事件或任务的存在,并在它们准备好时启动它们。
主要功能
-
run_forever(): 启动事件循环并 持续执行,直到调用stop()。 -
run_until_complete(future): 启动事件 循环并在给定的未来对象或协程完成后终止。 stop(): 停止事件循环。-
create_task(coroutine): 将协程计划为任务。
使用示例:
import asyncio
async def hello():
print("Hello, world!")
await asyncio.sleep(1)
print("Hello again!")
loop = asyncio.get_event_loop()
loop.run_until_complete(hello())
loop.close()
在这个例子中,我们首先使用 get_event_loop() 方法,来获取当前的 asyncio 库的EventLoop对象。
然后把协程hello添加到这个EventLoop中,并 通过run_until_complete() 方法请求执行它。
最后一步是通过close() 方法关闭EventLoop。
执行这个代码时,你会发现首先输出"Hello, world!",然后程序等待1秒钟,之后输出"Hello again!"。这展示了Event Loop如何管理异步函数的执行。
我们将在下一次讲座中更详细地探讨这些操作。
5.2 Tasks
任务 (Tasks) 是协程的封装,允许管理它们的执行和跟踪它们的状态。任务 可以通过事件循环并行运行协程,并通过它管理。
任务的创建和管理
-
asyncio.create_task(coroutine): 创建任务以 执行协程。 -
Task.result(): 返回已完成任务的结果,或如果任务以 错误结束则引发异常。 Task.cancel(): 取消任务的执行。
使用示例:
import asyncio
async def say_hello():
await asyncio.sleep(1)
print("Hello")
async def main():
task = asyncio.create_task(say_hello())
await task
asyncio.run(main())
在这个例子中,我们通过Task对象包装协程say_hello()。 它也是一个异步对象,因此要获得其结果,需要对其应用await操作符。
执行这个代码时,程序会等待1秒钟,然后输出"Hello"。这显示了Task如何管理协程的执行,以及我们如何通过await等待其完成。
我们将在下一次讲座中更详细地谈论Task任务的工作。
5.3 Futures
Future对象 表示异步操作的结果, 其将在未来可用。它们允许通过设置 结果或异常来管理异步操作的状态。
主要方法:
-
set_result(result): 为Future对象设置结果。 -
set_exception(exception): 为Future对象设置异常。 -
result(): 返回Future对象的结果, 或如果操作以错误结束则引发异常。 -
exception(): 返回异常,如果它 已被设置。
使用示例:
import asyncio
async def set_future(fut, value):
await asyncio.sleep(1)
fut.set_result(value)
async def main():
loop = asyncio.get_running_loop()
fut = loop.create_future()
await set_future(fut, 'Hello, future!')
print(fut.result())
asyncio.run(main())
在这个例子中,我们创建了Future,在一秒钟后设置其值,然后显示结果。你会发现程序等待一秒钟,然后输出'Hello, future!'。这展示了Future如何表示将在未来可用的结果。
与Task对象不同,Future对象绑定到特定的 Event Loop,并且执行的异步函数可以将其结果写入其中。尽管通常情况下这稍微不同。
通常,Future对象与Task任务结合使用,提供更高级别的异步操作管理。
现在你已经了解了Event Loop、Task和Future, 我们将更详细地研究它们。
GO TO FULL VERSION