欢迎访问宙启技术站
智能推送

Python的asyncio库中的CancelledError()异常详解

发布时间:2023-12-24 12:33:14

在Python的asyncio库中,CancelledError是一个用于表示任务被取消的异常类。当一个协程任务正在运行时,如果它被取消了,该任务将会引发CancelledError异常。

CancelledError异常类继承自BaseException类,而不是常见的Exception类。这是为了确保CancelledError异常不会被except语句捕捉,而只能被特定的代码段捕捉。这意味着CancelledError异常在正常的异常处理流程中是不可见的,只有在特定的代码段中才会被捕捉到。

以下是一个使用CancelledError异常的示例:

import asyncio

async def my_task():
    try:
        while True:
            print("Running my_task...")
            await asyncio.sleep(1)
    except asyncio.CancelledError:
        print("my_task has been cancelled!")

async def cancel_task(task):
    await asyncio.sleep(5)
    task.cancel()

async def main():
    my_task_obj = asyncio.create_task(my_task())
    cancel_task_obj = asyncio.create_task(cancel_task(my_task_obj))
    await asyncio.gather(my_task_obj, cancel_task_obj)

asyncio.run(main())

在上面的例子中,我们定义了一个my_task协程函数,该协程函数会不断输出"Running my_task..."并等待1秒钟。我们还定义了一个cancel_task协程函数,该函数会在5秒钟后取消my_task协程函数。在main函数中,我们创建了my_task和cancel_task的任务,并使用asyncio.gather函数等待它们结束。

当我们运行这个代码时,我们会看到my_task函数不断输出"Running my_task...",当5秒钟过去后,my_task会被取消,并引发CancelledError异常。我们可以捕捉CancelledError异常并输出"my_task has been cancelled!"。

需要注意的是,CancelledError异常在协程函数中被引发时,并不会停止协程的执行。协程函数中的代码需要通过检查取消状态来自行决定是否继续执行。在本例中,我们使用了一个无限循环来不断输出,但也可以在协程函数中添加一个判断来中断协程的执行。