异步编程中如何避免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()函数创建任务,并添加回调函数来处理被取消的任务。这样可以更好地控制和处理异步操作的取消情况。
