【问题标题】:Which is the best way to programatically terminate (cancel) a celery task这是以编程方式终止(取消)芹菜任务的最佳方法
【发布时间】:2019-03-14 10:53:52
【问题描述】:

根据 Celery 的文档,我们不应该使用 revoke() 函数中的 terminate 选项来取消正在执行的任务:

当任务卡住时,终止选项是管理员的最后手段。这不是为了终止任务,而是为了终止正在执行任务的进程,并且该进程可能在发送信号时已经开始处理另一个任务,因此您绝不能以编程方式调用它。

http://docs.celeryproject.org/en/latest/userguide/workers.html#revoke-revoking-tasks

所以,我的问题是,如果我需要以编程方式取消一些正在运行的任务,我应该怎么做?

【问题讨论】:

    标签: python python-3.x celery


    【解决方案1】:

    如果你真的需要杀死正在运行的任务,在revoke() 方法中使用terminate=True 是正确的方法,也是你最好的选择。问题是这样做并不能保证效果,或者更好地说,可能会产生负面影响。要了解原因,有必要了解撤销的工作原理以及 terminate=True 的作用。当您致电revoke() 时,您正在通过代理向您的工作人员发送广播消息。这意味着在您意识到您想要/需要终止任务、发送撤销消息并接收工作人员的控制命令之前,工作人员可能已经完成了任务,从队列中抓取了另一个任务并开始工作它。当它最终收到命令时,它只是杀死工作进程,到那时,它可能已经在处理不同的任务了。

    如果您事先知道您可能需要中止您的任务并可以调整任务代码,您可以查看abortable tasks

    【讨论】:

    • 这里应该注意的是,这需要数据库后端设置。
    猜你喜欢
    • 2017-11-06
    • 2021-07-27
    • 2022-11-12
    • 1970-01-01
    • 2012-09-28
    • 2014-06-10
    • 2016-05-18
    • 2017-03-08
    • 1970-01-01
    相关资源
    最近更新 更多