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