Django celery redis 从队列中删除特定的周期性任务
Django celery redis remove a specific periodic task from queue
有一个特定的周期性任务需要从消息队列中删除。我这里使用的是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
该代码可以工作,但我会选择不会在您每次需要 disable/enable 任务时强制您更新代码的东西。
你可以做的是使用一个可配置变量,其值可以来自管理面板、配置文件或任何你想要的,并在你的代码运行之前使用它 return 如果任务是处于禁用模式。
例如:
@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
这样即使你的任务被调度了,它的操作也不会被执行。
在此示例中,定期任务计划是直接在代码中定义的,这意味着它是硬编码的,如果不更改代码和重新部署应用程序就无法动态更改。
提供的代码删除了任务逻辑或在开头带有简单的 return
- 可以工作,但不会是问题的答案 - 任务仍然 运行,只是没有运行 的代码。
还有就是recommended NOT to use@periodic_task
:
"""Deprecated decorator, please use :setting:beat_schedule
."""
所以不推荐使用
首先,将方法从 @periodic_task
更改为普通芹菜 @task
,因为您使用的是 Django - 最好直接使用 @shared_task
:
from celery import shared_task
@shared_task
def task_abcd():
...
现在这只是 celery 任务之一,需要显式调用。或者,如果添加到 celery beat schedule 中,它可以定期 运行。
对于生产,如果使用多个工人,不建议 运行 带有嵌入式节拍 (-B) 的芹菜工人 - 运行 芹菜节拍调度程序的单独实例。
Schedule can specified in celery.py
or in django project settings (settings.py
).
还是不太动态,重新读取设置app需要重新加载
然后,使用 Database Scheduler 这将允许动态创建计划 - 哪些任务需要 运行 以及何时以及使用什么参数。它甚至为管理提供了很好的 django admin web 视图!
如果您只是想删除周期性任务,您是否尝试过删除该功能然后重新启动您的芹菜服务。您可以重新启动 Redis 服务以及 Django 服务器以进行安全措施。
确保您删除的函数没有在其他任何地方被引用。
有一个特定的周期性任务需要从消息队列中删除。我这里使用的是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
该代码可以工作,但我会选择不会在您每次需要 disable/enable 任务时强制您更新代码的东西。
你可以做的是使用一个可配置变量,其值可以来自管理面板、配置文件或任何你想要的,并在你的代码运行之前使用它 return 如果任务是处于禁用模式。
例如:
@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
这样即使你的任务被调度了,它的操作也不会被执行。
在此示例中,定期任务计划是直接在代码中定义的,这意味着它是硬编码的,如果不更改代码和重新部署应用程序就无法动态更改。
提供的代码删除了任务逻辑或在开头带有简单的 return
- 可以工作,但不会是问题的答案 - 任务仍然 运行,只是没有运行 的代码。
还有就是recommended NOT to use@periodic_task
:
"""Deprecated decorator, please use :setting:
beat_schedule
."""
所以不推荐使用
首先,将方法从 @periodic_task
更改为普通芹菜 @task
,因为您使用的是 Django - 最好直接使用 @shared_task
:
from celery import shared_task
@shared_task
def task_abcd():
...
现在这只是 celery 任务之一,需要显式调用。或者,如果添加到 celery beat schedule 中,它可以定期 运行。
对于生产,如果使用多个工人,不建议 运行 带有嵌入式节拍 (-B) 的芹菜工人 - 运行 芹菜节拍调度程序的单独实例。
Schedule can specified in celery.py
or in django project settings (settings.py
).
还是不太动态,重新读取设置app需要重新加载
然后,使用 Database Scheduler 这将允许动态创建计划 - 哪些任务需要 运行 以及何时以及使用什么参数。它甚至为管理提供了很好的 django admin web 视图!
如果您只是想删除周期性任务,您是否尝试过删除该功能然后重新启动您的芹菜服务。您可以重新启动 Redis 服务以及 Django 服务器以进行安全措施。
确保您删除的函数没有在其他任何地方被引用。