无法让Celery run_every属性工作

时间:2010-09-09 20:56:27

标签: python django celery

我正在尝试创建一些Celery Periodic Tasks,其中一些需要能够在运行时更改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'

然后关闭。在使用run_every属性时,Celery文档并没有真正进入什么状态,而且我没有运气搜索Google。 Celery changelogs表示它能够在1.0.0版本的运行时更改Periodic Task的间隔。

开发。环境:

  • Python 2.6.5
  • Django 1.2.1
  • Celery 2.0.2

1 个答案:

答案 0 :(得分:3)

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属性将在实例化时自动转换, 但不是以后。