Django Celery Beat 管理员更新 Cron Schedule 定期任务未生效

Posted

技术标签:

【中文标题】Django Celery Beat 管理员更新 Cron Schedule 定期任务未生效【英文标题】:Django Celery Beat admin updating Cron Schedule Periodic task not taking effect 【发布时间】: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 进程定期检查表是否有任何变化。

【问题讨论】:

可能重复:***.com/questions/21666229/… 不要认为它是重复的,因为我希望 Celery Beat 检测数据库中的时间表何时更新。 绝对不是重复的。链接的问题是关于如果 Django 设置更改(静态 .py 文件)重新加载 celery worker,而不是关于 celery beat 并在数据库任务更改时重新加载。 看起来this Github issue 是对同一个问题的讨论:(他们引用了这篇文章)。提出了一些解决方案,并不简单。还有here。没有给出解决方案。 【参考方案1】:

我已将 celery 从 4.0 更改为 3.1.25,将 django 更改为 1.9.11 并安装了 djcelery 3.1.17。然后再测试,就OK了。所以,也许这是一个错误。

【讨论】:

【参考方案2】:

我有一个解决方案:

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

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

【讨论】:

您的意思是,运行单独的进程,例如:celery beat ...celery worker ...?我已经这样做了,但仍然无法正常工作。 是的,使用数据库调度程序。每当数据库中的设置(时间等)发生变化时,您需要重新启动 Celery Beat 进程,以便它再次读取数据库。 如果您必须手动重新启动 Celery Beat 进程,您并没有解决问题,不是吗? “但是,如果在 Django-admin 中更改了计划时间,那么除非我重新启动 celery-beat 实例,否则这些更改不会生效。” 你需要在记录保存时添加一个信号来发布消息以重启Celery Beat。 啊,好吧,我错过了自动重新加载 Celery Beat 的信号部分。当 DB 读取 PeriodicTasks 发生某些变化时,它应该会自动重新加载,但它不起作用。调试库后,我同意@kenda-zheng,它同样是一个错误。最后,我将项目降级为@kenda-zheng 响应并且它可以工作。

以上是关于Django Celery Beat 管理员更新 Cron Schedule 定期任务未生效的主要内容,如果未能解决你的问题,请参考以下文章

django_celery_beat

django-celery-beat 垃圾邮件到期任务

python测试开发django-193.使用supervisord 后台启动celery 服务(worker/beat)

python测试开发django-197.django-celery-beat 定时任务

django-celery-beat时区问题

Django celery 和 celery-beat 守护进程脚本错误