CodeGym /课程 /Python SELF ZH /任务与事件循环的介绍

任务与事件循环的介绍

Python SELF ZH
第 25 级 , 课程 4
可用

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 LoopTaskFuture, 我们将更详细地研究它们。

评论
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION