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 作为单独的进程运行。
我正在记录设置 CrontabSchedule
和 PeriodicTask
实例的函数的信息,并且我看到了 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
的属性是设置对象。在将这些值写入字符串字段时,我们将set
的repr
作为值,这些值是无效的。
在 schedulers.py 的 all_as_schedule
方法中,这会导致 ValueError
被捕获并忽略,因此该任务不会被静默添加到计划中。
【讨论】:
以上是关于celery beat 没有发送消息(使用 django-celery-beat)的主要内容,如果未能解决你的问题,请参考以下文章
在 Heroku 上运行的 Celery beat 进程发送任务两次
Celery 注册了任务,但 beat 没有从已安装的应用程序中安排任务
Django + Telegram + Celery 的定期和非定期任务