Task类

Python SELF ZH
第 26 级 , 课程 0
可用

7.1 创建任务

模块中的Task类 asyncio 用于管理协程的执行。 任务(Tasks)是协程的包装器,允许管理其执行并跟踪其状态。 Task类允许通过事件循环并行运行协程。

Task类的主要方法

Task类是协程的一种包装,提供了以下附加功能:

管理协程执行:

任务使得管理协程的执行、控制其状态以及获得结果变得简单。

取消任务:

取消任务的功能使Task对于管理可能需要提前停止的长时间操作很有用。

回调函数:

任务支持添加回调函数,使得在任务完成时能执行附加操作。

创建任务:

任务通过函数asyncio.create_task(coroutine)或方法loop.create_task(coroutine)创建,这些都会计划协程的执行。


import asyncio

async def say_hello():
    print("Hello")
    await asyncio.sleep(1)
    print("World")

async def main():
    task = asyncio.create_task(say_hello())
    await task

asyncio.run(main())

7.2 主要方法

方法Task.cancel()

请求取消任务。如果任务尚未完成,它将通过引发CancelledError异常结束。

让我们写一个小程序来展示这一点。

  1. 创建一个将等待10秒的异步任务
  2. 将其包装到Task对象中
  3. 等待一秒钟以便任务(Task) 开始执行
  4. 取消任务 – task.cancel()
  5. 如果继续尝试通过await运算符等待任务(Task) 完成,我们将获得CancelledError异常。

import asyncio

async def main():
    task = asyncio.create_task(asyncio.sleep(10)) 
    await asyncio.sleep(1)
    task.cancel()
    try:
        await task
    except asyncio.CancelledError:
        print("Task was cancelled")

asyncio.run(main())

方法Task.result()

返回任务的执行结果。如果任务以异常结束,则调用result()时会引发该异常。


import asyncio

async def main():
    task = asyncio.create_task(asyncio.sleep(1, result='Completed'))
    result = await task
    print(result)  # Output: Completed

asyncio.run(main())

在我们的例子中甚至不需要编写额外代码 — await运算符知道如何处理Task对象:任务完成后,它将自动调用其result()方法并返回结果。

方法Task.exception()

返回任务引发的异常。如果任务没有异常完成,则返回None


import asyncio

async def main():
    task = asyncio.create_task(asyncio.sleep(1))
    try:
        result = await task
    except Exception as e:
        print(f"Task failed with exception: {e}")

asyncio.run(main())

也不需要编写额外代码 — 如果任务中出现异常,await运算符会调用exception()方法。

方法Task.add_done_callback(callback)

添加在任务完成时将被调用的回调函数(callback)


import asyncio

def callback(future):
    print("Task completed")

async def main():
    task = asyncio.create_task(asyncio.sleep(1))
    task.add_done_callback(callback)
    await task

asyncio.run(main())

可以为任务添加一个函数,当任务完成时自动调用。这样的方法使得代码非常灵活。更重要的是,可以为任何任务添加多个函数。

方法Task.done()

如果任务已完成(成功、失败或被取消),则返回True


import asyncio

async def main():
    task = asyncio.create_task(asyncio.sleep(1))
    await asyncio.sleep(1.5)
    print(task.done())  # Output: True

asyncio.run(main())

使用done()方法可以知道任务是否已成功完成。更准确地说,任务是否完成或被取消,因为如果发生异常,任务形式上可能未完成,但并未取消。总之,如果任务被取消(cancel),那么方法将返回False,否则返回True

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