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

Python中的CancelledError()异常解析和解决方法

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

在Python中,CancelledError是一个特殊的异常类型,它用于表示一个可被取消的操作被取消的情况。这个异常通常在使用asyncio模块进行异步编程时出现。

CancelledError的主要特点是它是一个继承自BaseException的异常类,而不是Exception的子类。这是因为CancelledError不是一个普通的异常,而是用于通知程序中的协程任务被取消的特殊情况。

当一个协程任务被取消时,asyncio会抛出CancelledError异常,这主要是通过调用Task.cancel()方法来实现的。被取消的协程任务必须要处理CancelledError异常,否则程序将会终止运行。

下面是一个关于如何捕获和处理CancelledError异常的示例:

import asyncio

async def my_task():
    try:
        while True:
            await asyncio.sleep(1)
            print("Task is running...")
    except asyncio.CancelledError:
        print("Task is cancelled!")

async def main():
    task = asyncio.create_task(my_task())
    await asyncio.sleep(5)
    task.cancel()  # 取消任务
    await task

asyncio.run(main())

在上面的示例中,我们自定义了一个my_task协程函数,它会每秒打印一条消息。在main函数中,我们创建了一个task通过asyncio.create_task()来运行my_task协程。然后,我们通过await asyncio.sleep(5)让程序等待5秒钟。在等待过程中,我们调用task.cancel()来取消my_task任务。最后,我们使用await task来等待任务完成。

当任务被取消时,my_task中的while循环将会被中断,然后进入except asyncio.CancelledError代码块,并打印出"Task is cancelled!"的消息。

你还可以使用asyncio.shield()函数来保护一个协程任务,使其无法被取消。下面是一个使用asyncio.shield()的示例:

import asyncio

async def my_task():
    try:
        while True:
            await asyncio.sleep(1)
            print("Task is running...")
    except asyncio.CancelledError:
        print("Task is cancelled!")

async def main():
    task = asyncio.create_task(asyncio.shield(my_task()))  # 使用asyncio.shield()保护任务
    await asyncio.sleep(5)
    task.cancel()  # 取消任务
    await task

asyncio.run(main())

在上面的示例中,我们在create_task()函数中使用了asyncio.shield()来保护my_task任务,使其无法被取消。因此,无论我们在main函数中调用task.cancel()多少次,my_task任务都会继续运行,不会被取消。

总结来说,CancelledError异常用于标识一个协程任务被取消的情况。在处理被取消的协程任务时,我们需要捕获和处理CancelledError异常,通常是通过在协程函数中使用try-except代码块。同时,使用asyncio.shield()函数可以保护一个协程任务,使其无法被取消。