Django Celery Beat管理员更新Cron计划周期性任务未生效

Ste*_*eve 10 django centos rabbitmq celery django-celery

我在CentOS 7上使用Django 10,RabbitMQ和Celery 4运行一个站点.

我的Celery Beat和Celery Worker实例由主管控制,我正在使用django celery数据库调度程序.

我在Django-admin中使用cronsheduler计划了一个cron样式的任务.

当我开始芹菜殴打和工人实例时,工作按预期开火.

但是如果在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时,此表中的计数器也会递增,这会告诉芹菜节拍服务从数据库重新加载计划.如果批量更新定期任务,则需要手动更新计数器:

from django_celery_beat.models import PeriodicTasks
PeriodicTasks.changed()
Run Code Online (Sandbox Code Playgroud)

从上面我可以看到Celery Beat流程定期检查表格是否有任何变化.

Ste*_*eve 1

我有一个解决方案:

  1. 创建一个使用 RabbitMQ 队列的单独工作进程。
  2. 当 Django 更新数据库时,它会向队列发布一条消息,其中包含 Celery Beat 进程的名称(名称由 Supervisor 配置定义)。
  3. 然后,工作进程会重新启动名为 Celery Beat 的进程。

有点啰嗦,但确实有效。还可以更轻松地管理同一服务器上需要相同功能的多个 Django 应用程序。