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

异步编程中如何避免Python中的CancelledError()异常

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

在异步编程中,CancelledError()异常通常是由于取消一个已经在执行的协程引起的。该异常会在协程中抛出,并且可以在协程的外层捕获和处理。为了避免CancelledError()异常的发生,可以采取以下方法:

1. 使用try-except语句捕获CancelledError()异常:

import asyncio

async def my_coroutine():
    try:
        # 执行耗时操作
        await asyncio.sleep(1)
    except asyncio.CancelledError:
        # 处理取消操作
        print("Coroutine has been cancelled")

async def main():
    task = asyncio.create_task(my_coroutine())
    await asyncio.sleep(0.5)
    # 取消协程
    task.cancel()
    await task

asyncio.run(main())

在上面的例子中,我们创建一个协程函数my_coroutine(),其中执行了一个耗时操作,在协程函数中使用try-except语句来捕获并处理CancelledError()异常。在main()函数中,我们创建一个任务task,然后等待一段时间后取消了任务。最后通过await task等待任务完成。

2. 使用ensure_future()函数创建任务,并添加回调函数:

import asyncio

def callback(fut):
    try:
        fut.result()  # 检查任务是否取消
    except asyncio.CancelledError:
        # 处理取消操作
        print("Coroutine has been cancelled")

async def my_coroutine():
    # 执行耗时操作
    await asyncio.sleep(1)

async def main():
    loop = asyncio.get_event_loop()
    fut = asyncio.ensure_future(my_coroutine())
    fut.add_done_callback(callback)
    await asyncio.sleep(0.5)
    # 取消任务
    fut.cancel()
    await fut

asyncio.run(main())

在上面的例子中,我们使用ensure_future()函数创建了一个任务fut,并通过add_done_callback()方法为任务添加了一个回调函数callback()。在回调函数中,检查任务是否被取消,并进行相应处理。在main()函数中,我们通过await fut等待任务完成,然后取消任务。

总结:在异步编程中,避免CancelledError()异常的发生可以使用try-except语句捕获异常并进行处理,或者使用ensure_future()函数创建任务,并添加回调函数来处理被取消的任务。这样可以更好地控制和处理异步操作的取消情况。