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

标签 django rabbitmq celery django-celery

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

现在我无法阻止它。我已经阅读了文档,但无法找到如何从执行队列中删除任务的方法。我曾尝试使用celeryctl和shell,但是Registry.tasks()为空,因此我看不到如何删除它。

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

谢谢。

最佳答案

任务是一条消息,“定期任务”会定期发送任务消息。发送的每个任务都将分配一个唯一的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:revoke是一个远程控制命令,因此仅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)

关于django - 在Django-Celery中停止/清除定期任务,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8230833/

相关文章:

rabbitmq - 跨节点平衡 RabbitMQ 主队列

kubernetes - 无法从Kubernetes Cron作业连接RabbitMQ

python - Celery:实例在一两周后变得缓慢

python - Django find_each(如 RoR)

python - 如何在 Django 和 AngularJS 中正确的代码?

java - 分析驻留在队列 RabbitMQ 中的消息

python - 关闭 Celery 任务

celery - 解决 celerybeat 的单点故障问题

python - 在Django中上传图片

django - 在 Django Mezzanine 中,如何对可以在页面树中的不同位置添加哪些自定义定义页面实现限制?