当前位置: 首页 > 面试题库 >

即使忽略了CancelledError,如何取消任务执行?

祁嘉言
2023-03-14
问题内容

这是取消任务的示例:

import asyncio


async def some_func():
    await asyncio.sleep(2)
    print('Haha! Task keeps running!')
    await asyncio.sleep(2)

async def cancel(task):
    await asyncio.sleep(1)
    task.cancel()

async def main():
    func_task = asyncio.ensure_future(some_func())
    cancel_task = asyncio.ensure_future(cancel(func_task))
    try:
        await func_task
    except asyncio.CancelledError:
        print('Task cancelled as expected')

if __name__ == "__main__":
    loop = asyncio.get_event_loop()
    loop.run_until_complete(main())

# Task cancelled as expected
# [Finished in 1.2s]

正常,任务已取消。如果CancelledError陷在some_func任务中不会被取消:

async def some_func():
    try:
        await asyncio.sleep(2)
    except:
        pass
    print('Haha! Task keeps running!')
    await asyncio.sleep(2)

# Haha! Task keeps running!
# [Finished in 3.2s]

可能很容易忘记我不应该在异步代码内(some_func例如,可以是第三方代码)禁止任何地方的异常,但是 应该
取消任务。反正我能做到吗?还是被忽略CancelledError意味着任务根本无法取消?


问题答案:

您无法取消抑制的任务CancelledError。这类似于无法关闭忽略的生成器GeneratorExit

这是故意行为。任务可能要在取消上做一些额外的工作(例如,资源清理),因此捕获CancelledError可能是个好主意,但抑制通常是编程错误的标志。

如果您有坚定的意图,Python通常允许您自己射击。

捕获所有异常甚至禁止通过按下来关闭python进程,因为它是在KeyboardInterrupt内部翻译的。



 类似资料:
  • 试图从其他人那里得到答案 假设我有一个简单的控制器,如下所示: 我希望处理忽略“取消”信号,这通常在客户端断开连接时出现。试图通过nginx的

  • 问题内容: 我一直在阅读文档并进行搜索,但似乎找不到直接的答案: 你可以取消已经执行的任务吗?(由于任务已开始,需要一段时间,因此需要取消一半) 我是从Celery FAQ的文档中找到的 但是我不清楚这是否会取消排队的任务,或者是否会杀死工作程序上正在运行的进程。感谢你能摆脱的光芒! 问题答案: 撤销将取消任务执行。如果任务被吊销,工人将忽略该任务并且不执行它。如果你不使用持久撤销,则可以在wor

  • 根据我的理解,clean现在将调用clearVersionProperties,war将调用WriteVersionProperties。 但当我执行分级清洁时,Reactor计划看起来是这样的: 为什么要执行clearVersionProperties和writeVersionProperties任务,因为它们绑定到某些构建阶段?例如,不执行任务infoEnv,而是执行任务writeVersio

  • 如果网络连接已打开超过几个小时,我将使用关闭网络连接。然而,在大多数情况下,网络连接在达到超时之前就关闭了,因此我取消了。在这种情况下,我还希望executor服务终止并释放其线程池。 令我惊讶的是,这并不是开箱即用的:虽然我在调度任务后对executor服务调用了<code>shutdown(),但当其唯一调度的任务被取消时,executor不会自动终止。从这种行为甚至可能是正确的,因为可以说取

  • 问题内容: 我将Redis作为经纪人使用Celery(3.0.15)。 有没有一种简单的方法来查询Celery队列中存在的具有给定名称的任务数? 并且,作为后续措施,是否可以取消Celery队列中存在的所有具有给定名称的任务? 我已经看过《监控和管理指南》,在那儿看不到解决方案。 问题答案:

  • 我是RxJava的新手。我有一个,用于下载图像URL列表并将其转换为位图的简单网络操作。 在活动的上,我取消订阅可观察到的以避免内存泄漏。 我能看到的是,如果我在图像下载过程中退出活动,后台任务也会被终止。我只想继续做背景工作,即使我已经取消了《观察家》的订阅。有可能吗?