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

Pythonasync/await中的CancelledError()异常的识别和处理

发布时间:2023-12-24 12:35:15

在Python的async/await语法中,CancelledError()异常是由取消一个协程任务而引发的异常。当一个协程任务被取消时,它会引发CancelledError()异常。这个异常可以被捕获并做进一步处理,以便在协程任务被取消时执行一些清理工作。

在async/await语法中,取消一个协程任务可以通过调用task.cancel()来实现。当一个任务被取消时,它会立即停止执行并引发CancelledError()异常。被取消的任务的所属的事件循环会在协程任务的当前await表达式上引发CancelledError()异常。

下面是一个使用async/await的例子,演示了如何识别和处理CancelledError()异常:

import asyncio

async def my_coroutine():
    try:
        while True:
            await asyncio.sleep(1)
            print("Coroutine is running")
    except asyncio.CancelledError:
        print("Coroutine was cancelled")

async def main():
    # 创建一个协程任务
    task = asyncio.create_task(my_coroutine())

    # 等待一段时间后取消任务
    await asyncio.sleep(5)
    task.cancel()

    # 等待任务完成
    try:
        await task
    except asyncio.CancelledError:
        print("CancelledError was caught")

asyncio.run(main())

在这个例子中,我们定义了一个名为my_coroutine()的协程函数。这个函数会不断地打印"Coroutine is running",直到它被取消为止。在main()函数中,我们创建了一个名为task的协程任务,然后等待5秒后取消这个任务。最后,我们使用try-except语句来捕获并处理CancelledError()异常。

运行这个例子后,我们会看到如下的输出:

Coroutine is running
Coroutine is running
Coroutine is running
Coroutine is running
Coroutine was cancelled
CancelledError was caught

在输出中,我们可以看到协程任务在取消之前不断地运行。当任务被取消时,它会停止运行并引发CancelledError()异常。这个异常被捕获并继续执行,最终输出"CancelledError was caught"。

通过识别和处理CancelledError()异常,我们可以在协程任务被取消时执行一些清理工作,例如关闭文件、释放资源等。