celery beat 没有发送消息(使用 django-celery-beat)

Posted

技术标签:

【中文标题】celery beat 没有发送消息(使用 django-celery-beat)【英文标题】:No messages being sent by celery beat (using django-celery-beat) 【发布时间】:2022-01-20 00:30:59 【问题描述】:

我正在为 Django 项目升级到 celery 5.x。由于不再有 @scheduled_task 装饰器,我将所有这些更改为 @shared_task 并编写了一些代码来创建 CrontabSchedule 实例并将 PeriodicTask 实例与应该按计划运行的每个任务的实例相关联。我从beat_init 信号接收器调用它。我将 celery worker & beat 作为单独的进程运行。

我正在记录设置 CrontabSchedulePeriodicTask 实例的函数的信息,并且我看到了 celery beat 进程的日志输出。紧接着,我看到 DatabaseScheduler: Schedule changed." 消息。这一切都符合预期并且很好。

然而,随后,celery beat 只是坐着,什么也不做。 beat 从不发送任何消息,因此 celery worker 从不执行任何计划任务。

django-admin shell_plus 中,PeriodicTask.objects.all() 向我展示了许多计划任务,这些计划的计划看起来都应该如此。这是输出中的 1 个示例,应该每天每分钟运行一次:

<PeriodicTask: dhnetwork.tasks.send_queued_mail: 0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59 0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23 * 1,2,3,4,5,6,7,8,9,10,11,12 0,1,2,3,4,5,6 (m/h/dM/MY/d) America/Los_Angeles>

任何想法我可能做错了什么和/或如何诊断问题?

【问题讨论】:

【参考方案1】:

我发现了问题。我正在创建crontab 的实例来验证值,然后将值从crontab 实例的属性复制到``CrontabSchedule 实例的字段,但crontab 的属性是设置对象。在将这些值写入字符串字段时,我们将setrepr 作为值,这些值是无效的。

在 schedulers.py 的 all_as_schedule 方法中,这会导致 ValueError 被捕获并忽略,因此该任务不会被静默添加到计划中。

【讨论】:

以上是关于celery beat 没有发送消息(使用 django-celery-beat)的主要内容,如果未能解决你的问题,请参考以下文章

Celery 使用

在 Heroku 上运行的 Celery beat 进程发送任务两次

Celery 注册了任务,但 beat 没有从已安装的应用程序中安排任务

Django + Telegram + Celery 的定期和非定期任务

如何将基于类的任务传递给 CELERY_BEAT_SCHEDULE

django redis celery 和 celery beats 的正确设置