我正在阅读任务取消的异步文档,我偶然发现了这 -
若要取消正在运行的任务,请使用cancel()方法。调用它将导致任务将一个CancelledError异常抛到包装的协同线中。如果在取消过程中,一个协同线正在等待一个未来对象,则将取消未来对象。 可用于检查任务是否已取消。如果包装的coroutine 没有抑制CancelledError异常,并且实际上被取消了,则该方法返回True。
我有几个问题要问-
wrapped_coroutine()是任务抛出异常的包装协同线吗?还有一个不相关的(与取消任务有关),当我取消这些任务时,我如何从这些任务中检索异常,这样我就看不到了-
Task exception was never retrieved future:它是在task.cancel()之前还是在await task之前的try中(在上面的例子中)?
发布于 2019-05-09 06:24:25
查看文档https://docs.python.org/3/library/asyncio-task.html#asyncio.Task.cancel中给出的示例中的代码
async def cancel_me():
print('cancel_me(): before sleep')
try:
# Wait for 1 hour
await asyncio.sleep(3600)
except asyncio.CancelledError:
print('cancel_me(): cancel sleep')
raise
finally:
print('cancel_me(): after sleep')
async def main():
# Create a "cancel_me" Task
task = asyncio.create_task(cancel_me())
# Wait for 1 second
await asyncio.sleep(1)
task.cancel()
try:
await task
except asyncio.CancelledError:
print("main(): cancel_me is cancelled now")
asyncio.run(main())回答你的问题:
cancel_me();.cancel()在main()中被调用。task.cancel()之后抛出此异常。它被抛入协同线中,在该示例中捕获它,然后重新引发,以被抛出,并在等待的例程中捕获。cancel_me()在捕捉到它之后不会重新引发异常。正如cancelled()的文档所述:“当使用cancel()请求取消任务时,任务被取消,包装的协同线将抛出的CancelledError异常传播到其中。”https://stackoverflow.com/questions/56052748
复制相似问题