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

Python中取消异步任务时出现CancelledError()异常如何处理

发布时间:2023-12-24 12:34:19

在Python中,可以通过使用asyncio.CancelledError异常来取消异步任务。asyncio.CancelledErrorasyncio模块中定义的一个异常,用于在协程被取消时触发。

要处理CancelledError异常,首先需要在可能被取消的协程中使用try-except代码块来捕获异常。然后,在捕获到CancelledError异常后,可以选择做一些清理工作或者重新引发异常。

下面是一个简单的例子,演示了如何处理CancelledError异常:

import asyncio

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

async def main():
    task = asyncio.create_task(my_task())
    await asyncio.sleep(3)
    task.cancel()
    await task  # 等待任务完成或引发异常

asyncio.run(main())

在这个例子中,我们定义了一个名为my_task的协程,它会一直打印"Running..."并每隔1秒钟暂停一次。然后,在main函数中,我们创建了一个my_task的任务,并等待3秒钟后取消这个任务。

当任务被取消时,my_task协程会引发asyncio.CancelledError异常。我们在my_tasktry-except代码块中捕获了这个异常,并打印了一条消息。然后,我们等待任务完成或引发异常,以确保任务被完全清理。

运行这个程序,你会看到"Running..."被打印三次,然后出现"Task was cancelled"。

需要注意的是,在取消一个任务后,我们需要明确地等待任务完成或引发异常。这是因为cancel方法仅仅发送了一个取消请求,而不会阻塞等待任务完成。因此,我们需要使用await语句来等待任务的完成。

另外,我们还可以在try代码块中执行一些额外的清理工作,例如关闭打开的文件、释放资源等。这样可以确保在任务被取消时,我们的代码能够安全地进行清理操作。

总结起来,处理asyncio.CancelledError异常的步骤如下:

1. 在可能被取消的协程中使用try-except代码块来捕获异常。

2. 在except代码块中处理被取消时的情况,例如打印一条消息或进行一些清理工作。

3. 在取消任务后,使用await语句来等待任务完成或引发异常。

通过这种方式,我们可以在异步任务被取消时,优雅地处理取消请求,并进行相应的清理操作。