【问题标题】:Stopping/Purging Periodic Tasks in Django-Celery停止/清除 Django-Celery 中的定期任务
【发布时间】:2011-11-22 17:14:32
【问题描述】:

我已经设法通过继承 PeriodicTask 让周期性任务在 django-celery 中工作。我试图创建一个测试任务并将其设置为运行无用的事情。有用。

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

我看到了我应该“撤销”它的建议,但为此我似乎需要一个任务 ID,而且我看不到如何找到任务 ID。

谢谢。

【问题讨论】:

    标签: django rabbitmq celery django-celery


    【解决方案1】:

    任务是一条消息,“周期性任务”会定期发送任务消息。每个发送的任务都将分配一个唯一的 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 管理界面。

    PS1:revoke 不会停止已经开始的任务。它只会取消 尚未开始的任务。您可以使用终止正在运行的任务 revoke(task_id, terminate=True)。默认情况下,这会将TERM 信号发送到 该过程,如果您想发送另一个信号(例如 KILL),请使用 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)
    

    【讨论】:

    • 感谢您提供如此详尽的回答。
    【解决方案2】:

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

    您可能应该首先仔细检查您使用的是哪个scheduler class

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

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

    django-celery 还附带一个调度器,将调度存储在 Django 数据库中

    虽然文档确实提到了一种删除周期性任务的方法:

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

    我们希望以编程方式或通过 shell 中的(芹菜/管理)命令执行删除。

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

    $ python manage.py shell
    >>> from djcelery.models import PeriodicTask
    >>> pt = PeriodicTask.objects.get(name='the_task_name')
    >>> pt.delete()
    

    我希望这会有所帮助!

    【讨论】:

      猜你喜欢
      • 2014-02-23
      • 1970-01-01
      • 2022-01-01
      • 2020-12-25
      • 2017-01-06
      • 1970-01-01
      • 1970-01-01
      • 2021-02-26
      • 2019-01-07
      相关资源
      最近更新 更多