首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Python Asyncio任务取消

Python Asyncio任务取消
EN

Stack Overflow用户
提问于 2019-05-09 05:28:39
回答 1查看 25.2K关注 0票数 17

我正在阅读任务取消的异步文档,我偶然发现了 -

若要取消正在运行的任务,请使用cancel()方法。调用它将导致任务将一个CancelledError异常抛到包装的协同线中。如果在取消过程中,一个协同线正在等待一个未来对象,则将取消未来对象。 可用于检查任务是否已取消。如果包装的coroutine 没有抑制CancelledError异常,并且实际上被取消了,则该方法返回True。

我有几个问题要问-

  • 包装的协同线是调用cancel的协同线吗?我们举个例子- 异步def wrapped_coroutine():用于asyncio.Task.all_tasks():task.cancel()中的任务 那么,wrapped_coroutine()是任务抛出异常的包装协同线吗?
  • 什么时候会抛出这个异常?在哪呢?
  • 在这里,压制例外意味着什么?是不是意味着- 异步def wrapped_coroutine():对于asyncio.Task.all_tasks():task.cancel()中的任务,task.cancel()尝试:等待任务,除了asyncio.CancelledError: print(“任务取消”) 如果没有,请提供一个如何抑制此异常的示例。

还有一个不相关的(与取消任务有关),当我取消这些任务时,我如何从这些任务中检索异常,这样我就看不到了-

代码语言:javascript
复制
Task exception was never retrieved future:

它是在task.cancel()之前还是在await task之前的try中(在上面的例子中)?

EN

回答 1

Stack Overflow用户

发布于 2019-05-09 06:24:25

查看文档https://docs.python.org/3/library/asyncio-task.html#asyncio.Task.cancel中给出的示例中的代码

代码语言:javascript
复制
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的协同线吗?” 不,这里的包装协同线是cancel_me().cancel()main()中被调用。
  • “什么时候会抛出这个异常?在哪里?” 在调用task.cancel()之后抛出此异常。它被抛入协同线中,在该示例中捕获它,然后重新引发,以被抛出,并在等待的例程中捕获。
  • “在这里压制例外意味着什么?” 如果cancel_me()在捕捉到它之后不会重新引发异常。正如cancelled()的文档所述:“当使用cancel()请求取消任务时,任务被取消,包装的协同线将抛出的CancelledError异常传播到其中。”
票数 16
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56052748

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档