【问题标题】:Can't get Celery run_every property to work无法让 Celery run_every 属性工作
【发布时间】:2011-04-10 11:30:50
【问题描述】:

我正在尝试创建一些 Celery 定期任务,其中一些需要能够在运行时更改 run_every 时间。 Celery 文档说我应该能够通过将 run_every 属性转换为属性来做到这一点 (http://packages.python.org/celery/faq.html#can-i-change-the-interval-of-a-periodic-task-at-runtime)。

这是我正在做的事情:

class ParseSomeStuffTask(PeriodicTask):

    def run(self, **kwargs):
        # Do stuff

    @property
    def run_every(self):
        if datetime.now().weekday() in [1, 2, 3]:
            return timedelta(minutes=15)
        else:
            return timedelta(seconds=40)

不幸的是,当我打开 celerybeat 时,出现以下错误:

[2010 年 9 月 9 日星期四 15:44:40: CRITICAL/828]:celerybeat 升高 例外 : 'datetime.timedelta' 对象没有 属性'is_due'

然后它会关闭。 Celery 文档并没有真正讨论将 run_every 设为属性时要返回的内容,而且我在谷歌搜索时也没有任何运气。 Celery 更新日志说,自 1.0.0 版以来,它能够在运行时更改定期任务的间隔。

开发。环境:

  • Python 2.6.5
  • Django 1.2.1
  • 芹菜 2.0.2

【问题讨论】:

  • 因此 run_every 由一个必须返回 timedelta 的属性表示。在您的代码中的某个地方,它必须利用 is_due ,就像您的错误显示一样。上面的代码似乎应该按预期工作。除非我遗漏了有关 is_due 执行位置的信息。
  • 将其更改为固定时间增量(而不是使用属性描述符)时是否有效?
  • 是的,那么工作正常。我可以注释掉我创建的属性并在该类声明下添加 run_time = timedelta(seconds=40) 。那我就改不了了:(

标签: python django celery


【解决方案1】:

Celery 2.0 支持不同的调度行为。有celery.task.schedules.schedulecelery.task.schedules.crontab

您必须返回其中之一,或制作您自己的时间表子类。

from celery.task.schedules import schedule

@property
def run_every(self):
    if datetime.now().weekday() in [1, 2, 3]:
        return schedule(timedelta(minutes=15))
    else:
        return schedule(timedelta(seconds=40))

run_every 属性将在实例化时自动转换, 但不是以后。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-06-05
    • 1970-01-01
    • 2012-03-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-01-30
    相关资源
    最近更新 更多