在Django-Celery中停止/清除定期任务

问题描述 投票:7回答:2

通过将PeriodicTask子类化,我设法使定期任务在django-celery中工作。我试图创建一个测试任务并将其设置为无用地运行。有用。

现在我无法阻止它。我已经阅读了文档,但找不到如何从执行队列中删除任务。我已经尝试过使用celeryctl和外壳程序,但是Registry.tasks()为空,所以我看不到如何删除它。

我已经看到一些建议,我应该“撤消”它,但是为此,我似乎需要一个任务ID,但看不到如何找到该任务ID。

谢谢。

django rabbitmq celery django-celery
2个回答
21
投票

任务是一条消息,“周期性任务”以周期性间隔发送任务消息。发送的每个任务都将分配有唯一的ID。

revoke仅取消单个任务消息。要获取任务的ID,您必须保留跟踪发送的ID,但您也可以在发送任务时指定自定义ID。

我不确定您是否要取消单个任务消息,或者是否要停止定期任务发送更多消息,所以我将列出这两个任务的答案。

没有内置的方法可以保留定期任务发送的任务ID,但是您可以将每个任务的ID设置为定期任务的名称,这样该ID将引用随定期任务一起发送的任何任务(通常是最后一个)。您可以通过这种方式指定自定义ID,

使用@periodic_task装饰器:

@periodic_task(options={"task_id": "my_periodic_task"})
def my_periodic_task():
    pass

或使用CELERYBEAT_SCHEDULE设置:

CELERYBEAT_SCHEDULE = {name: {"task": task_name,
                              "options": {"task_id": name}}}

如果要删除定期任务,只需从代码库中删除@periodic_task,或从CELERYBEAT_SCHEDULE中删除条目。如果您使用的是Django数据库调度程序,则必须删除定期任务在Django Admin界面中。

PS1:revoke不会停止已经启动的任务。它只会取消尚未开始的任务。您可以使用终止正在运行的任务revoke(task_id, terminate=True)。默认情况下,这会将TERM信号发送到如果您要发送其他信号(例如杀死),请使用revoke(task_id, terminate=True, signal="KILL")

PS2:撤消是一个远程控制命令,因此只有RabbitMQ支持和Redis经纪人运输。如果您希望您的任务支持取消,则应通过存储cancelled在数据库中标记并让任务在启动时检查该标记:

from celery.task import Task

class RevokeableTask(Task):
    """Task that can be revoked.

    Example usage:

        @task(base=RevokeableTask)
        def mytask():
            pass
    """

    def __call__(self, *args, **kwargs):
        if revoke_flag_set_in_db_for(self.request.id):
            return
        super(RevokeableTask, self).__call__(*args, **kwargs)

3
投票

以防万一这可能对某人有所帮助……我们在工作中遇到了同样的问题,尽管做出了一些努力来寻找某种管理命令来删除此定期任务,但我们做不到。所以这里有一些指针。

您可能应该先仔细检查您正在使用哪个scheduler class

默认调度程序为celery.beat.PersistentScheduler,它只是跟踪本地数据库文件中的最后运行时间(搁置)。

在我们的例子中,我们使用的是djcelery.schedulers.DatabaseScheduler类。

[djcelery.schedulers.DatabaseScheduler还附带了将计划存储在Django数据库中的计划程序]

尽管文档确实提到了一种删除定期任务的方法:

使用django-celery的调度程序,您可以从Django Admin中添加,修改和删除定期任务。

我们想以编程方式或通过外壳中的(celery / management)命令执行删除。

由于找不到命令行,我们使用了django / python shell:

django-celery

我希望这会有所帮助!

© www.soinside.com 2019 - 2024. All rights reserved.