【问题标题】:Does django_celery_beat support crontab schedules with multiple minutes/hours?django_celery_beat 是否支持多分钟/小时的 crontab 计划?
【发布时间】:2018-05-08 04:38:13
【问题描述】:

我正在使用django-celery (https://pypi.python.org/pypi/django-celery/) 在数据库中存储 celery beat(定期任务)时间表。但它不支持 celery 超过 3.1.25 版本。我想迁移到 celery 4.1.0,所以我正在考虑迁移到 django-celery-beat (https://pypi.python.org/pypi/django_celery_beat) 以获取基于 db 的时间表。

我能够成功迁移表结构以及数据。但是,我看到 django-celery-beat 不支持 djcelery 支持的多分钟和多小时的 crontab 计划。

例如,考虑这个 crontab 计划 - 15,30,45 0,1 * * *

任务将在每天 12:15、12:30、12:45、1:15、1:30、1:45 运行。这曾经在 django-celery 中工作。但在 django-celery-beat 中,它似乎只在 12:15 执行(第一次)。

旧设置 - Django==1.10, celery==3.1.24, django-celery==3.1.17

新设置 - Django==1.11.7, celery==4.1.0, django-celery-beat==1.1.0

谁能确认在 django-celery-beat 中是否已经放弃了对此类 crontab 计划的支持?如果它应该工作,是芹菜还是 django-celery-beat 的问题?

谢谢

【问题讨论】:

  • 嗯...当您从数据库中提取它们时,您的列表中有这些还是什么?你用get_or_create吗?
  • @mutantkeyboard 这些是数据库中使用django-celery 创建的现有计划。我也尝试过创建新的,但不是用 get_or_create。我直接创建了一个CrontabSchedule 对象并保存了它。如果我不使用 get_or_create 会有什么不同吗?
  • 所以我假设你有类似app.conf.beat_schedule = { # Executes every Monday morning at 7:30 a.m. 'first-task': { 'task': 'tasks.add', 'schedule': crontab(hour=7, minute=30, day_of_week=1), 'args': (16, 16), }, 'second-task': { 'task': 'tasks.add', 'schedule': crontab(hour=12, minute=30, day_of_week=1), 'args': (16, 16), } } 的东西,它应该是每个任务的字典集合。
  • @mutantkeyboard 不。如果我在数据库中存储时间表,为什么需要这样做?
  • @ksrini 你在运行 celery beat 并在命令中选择了调度程序类吗?

标签: python django celery django-celery


【解决方案1】:

您能否确切地确认您如何将列表值指定给数据库?

我发现这样的列表似乎有效:“5,10,15”。例如,我有一个如下所示的时间表:

0,4,8,12,16,20,24,28,32,36,40,44,48,52,56 * * * 1,2,3,4,5,6,7,8 ,9,10,11,12 (m/h/d/dM/MY)

这是 django-celery-beat==1.1.0、celery==4.1.0 和 Django==2.0.1。准确地说,我从名为schedule 的 celery.schedule.crontab 对象构造了如下调用,如下所示:

crontab = {}
for attr in ['minute', 'hour', 'day_of_week', 'day_of_month', 'month_of_year']:
    crontab[attr] = str(list(getattr(schedule, attr)))[1:-1]
self.object.schedule = CrontabSchedule.objects.create(**crontab)

然而,我将提交一个错误,因为用于存储月份日期的数据库字段长度为 64 个字符,对于最坏的情况 '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' 是 83 个不带空格的字符或 113 个带空格的字符。

【讨论】:

  • 提到的错误被归档为#122
  • 我没有在列表中使用方括号。它曾经在 djcelery 中不带括号工作。因此问题。
  • 我明白了。我刚刚回顾了单元测试,AFAICS,没有括号的逗号分隔列表也应该可以工作。例如,请参阅the tests around。这就是为什么我要求你准确地展示你是如何调用代码的。没有看到很难猜测您的问题是什么。
  • 在进一步的测试中,括号不起作用(不要问我为什么认为它们起作用),但列表肯定起作用,我提到的版本。我正在更新我的答案以反映这一点。
  • 我查看了您提到的测试的链接。测试test_CrontabSchedule_schedule 似乎表明逗号分隔值应该有效。不是吗?
猜你喜欢
  • 2019-06-17
  • 2021-05-05
  • 2012-01-22
  • 1970-01-01
  • 1970-01-01
  • 2012-06-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多