【问题标题】:Django celery redis remove a specific periodic task from queueDjango celery redis 从队列中删除特定的周期性任务
【发布时间】:2020-05-12 14:13:06
【问题描述】:

有一个特定的周期性任务需要从消息队列中删除。我这里使用的是 Redis 和 celery 的配置。

tasks.py

@periodic_task(run_every=crontab(minute='*/6'))
def task_abcd():
    """
    some operations here
    """

项目中还有其他周期性任务,但我需要停止此特定任务才能从现在开始停止。

正如answer 中所解释的,下面的代码可以工作吗?

@periodic_task(run_every=crontab(minute='*/6'))
def task_abcd():
    pass

【问题讨论】:

  • 你在使用 django-celery-beat 吗?
  • 不,我没有使用 django-celery-beat。
  • 如果您不想执行周期性任务,请移除该功能。简单吧?我真的不明白你的确切用例是什么:(
  • 当我删除了该函数但它会显示错误说 Received unregistered task of type KeyError('shared_app.tasks.task_abcd',)。该消息已被忽略并丢弃。这就是问题所在,我的朋友。

标签: python django redis celery periodic-task


【解决方案1】:

该代码可以工作,但我会选择不会强制您在每次需要禁用/启用任务时更新代码的东西。

您可以做的是使用一个可配置变量,其值可以来自管理面板、配置文件或您想要的任何内容,如果任务处于禁用模式,则使用它在代码运行之前返回。

例如:

@periodic_task(run_every=crontab(minute='*/6'))
def task_abcd():
    config = load_config_for_task_abcd()

    if not config.is_enabled:
        return

    # some operations here

这样,即使你的任务被调度,它的操作也不会被执行。

【讨论】:

  • 如果我不想执行任务,这似乎是一种很好的处理方式。但是,如果我想删除该特定任务并且从不将其添加到队列中怎么办。 IE。从队列中完全删除任务。有什么解决办法吗?
【解决方案2】:

在此示例中,周期性任务计划直接在代码中定义,这意味着它是硬编码的,如果不更改代码和重新部署应用程序,就无法动态更改。

提供的代码删除了任务逻辑或在开头使用简单的return - 可以工作,但不是问题的答案 - 任务仍然会运行,只是没有代码可以运行。

还有就是recommended NOT to use@periodic_task:

"""已弃用的装饰器,请使用:setting:beat_schedule。"""

所以不建议使用。


首先,将方法从 @periodic_task 更改为普通 celery @task,并且因为您使用的是 Django - 最好直接使用 @shared_task

from celery import shared_task

@shared_task
def task_abcd():
    ...

现在这只是 celery 任务之一,需要显式调用。或者,如果添加到 celery beat 时间表中,它可以定期运行。

对于生产,如果使用多个工人,不建议使用嵌入式节拍 (-B) 运行 celery worker - 运行单独的 celery beat 调度程序实例。

可以在celery.py或django项目设置(settings.py)中安排specified

它仍然不是很动态,因为重新读取设置应用需要重新加载。

然后,使用Database Scheduler,这将允许动态创建计划 - 需要运行哪些任务以及何时以及使用什么参数。它甚至为管理提供了不错的 django admin web 视图!

【讨论】:

  • 我会看看答案,然后告诉你。 :) :)
【解决方案3】:

如果您只是想删除周期性任务,您是否尝试过删除该功能,然后重新启动您的 celery 服务。您可以重新启动 Redis 服务以及 Django 服务器以确保安全。

确保您删除的函数没有在其他任何地方引用。

【讨论】:

  • 我删除了代码并重新启动了 celery 服务,但它仍然无法正常工作。先前未完成的任务未从队列中删除。谢谢你的回答:)
猜你喜欢
  • 2018-11-28
  • 1970-01-01
  • 1970-01-01
  • 2013-11-20
  • 2020-09-30
  • 1970-01-01
  • 2019-02-16
  • 2015-06-16
  • 2012-01-03
相关资源
最近更新 更多