Django Celery Beat 管理员更新 Cron Schedule 定期任务未生效
Django Celery Beat admin updating Cron Schedule Periodic task not taking effect
我是 运行 一个在 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 时,此 table 中的计数器也会递增,这会告诉 celery beat
服务从数据库重新加载计划。
如果批量更新定期任务,则需要手动更新计数器:
from django_celery_beat.models import PeriodicTasks
PeriodicTasks.changed()
从上面我希望 Celery Beat 进程定期检查 table 是否有任何更改。
我有一个解决方案:
- 创建一个使用 RabbitMQ 队列的单独工作进程。
- 当 Django 更新数据库时,它会向队列发送一条消息,其中包含 Celery Beat 进程的名称(名称由 Supervisor 配置定义)。
- 工作进程然后重新启动命名的 Celery Beat 进程。
有点长篇大论,但很管用。还可以更轻松地在同一台服务器上管理需要相同功能的多个 Django 应用程序。
我已经将 celery 从 4.0 更改为 3.1.25,将 django 更改为 1.9.11 并安装了 djcelery 3.1.17。然后再测试,就OK了。所以,也许这是一个错误。
我是 运行 一个在 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 时,此 table 中的计数器也会递增,这会告诉 celery beat 服务从数据库重新加载计划。 如果批量更新定期任务,则需要手动更新计数器:
from django_celery_beat.models import PeriodicTasks
PeriodicTasks.changed()
从上面我希望 Celery Beat 进程定期检查 table 是否有任何更改。
我有一个解决方案:
- 创建一个使用 RabbitMQ 队列的单独工作进程。
- 当 Django 更新数据库时,它会向队列发送一条消息,其中包含 Celery Beat 进程的名称(名称由 Supervisor 配置定义)。
- 工作进程然后重新启动命名的 Celery Beat 进程。
有点长篇大论,但很管用。还可以更轻松地在同一台服务器上管理需要相同功能的多个 Django 应用程序。
我已经将 celery 从 4.0 更改为 3.1.25,将 django 更改为 1.9.11 并安装了 djcelery 3.1.17。然后再测试,就OK了。所以,也许这是一个错误。