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