【发布时间】:2017-03-27 13:30:08
【问题描述】:
我正在 CentOS 7 上使用 Django 10、RabbitMQ 和 Celery 4 运行一个站点。
我的 Celery Beat 和 Celery Worker 实例由主管控制,我正在使用 django celery 数据库调度程序。
我已经使用 Django-admin 中的 cronsheduler 安排了一个 cron 样式的任务。
当我启动 celery beat 和 worker 实例时,作业会按预期触发。
但是,如果在 Django-admin 中更改了计划时间,那么除非我重新启动 celery-beat 实例,否则这些更改不会生效。
我有什么遗漏或者我需要编写自己的调度程序吗?
Celery Beat,使用 'django_celery_beat.schedulers.DatabaseScheduler' 从数据库加载时间表。根据以下文档https://media.readthedocs.org/pdf/django-celery-beat/latest/django-celery-beat.pdf,这应该会强制 Celery Beat 重新加载:
以特定间隔(例如每 5 秒)运行的计划。 • django_celery_beat.models.CrontabSchedule 一种 日程 和 字段 喜欢 条目 在 cron:分钟 小时 星期几 day_of_month month_of_year。
django_celery_beat.models.PeriodicTasks 此模型仅用作跟踪计划何时更改的索引。每当您更新 PeriodicTask 时,此表中的计数器也会增加,这告诉 celery beat 服务以从数据库重新加载计划。 如果您批量更新定期任务,则需要手动更新计数器:
from django_celery_beat.models import PeriodicTasks
PeriodicTasks.changed()
从上面我希望 Celery Beat 进程定期检查表是否有任何变化。
【问题讨论】:
-
不要认为它是重复的,因为我希望 Celery Beat 检测数据库中的时间表何时更新。
-
绝对不是重复的。链接的问题是关于如果 Django 设置更改(静态
.py文件)重新加载 celery worker,而不是关于celery beat并在数据库任务更改时重新加载。 -
看起来this Github issue 是对同一个问题的讨论:(他们引用了这篇文章)。提出了一些解决方案,并不简单。还有here。没有给出解决方案。
标签: django centos rabbitmq celery django-celery