2010-09-09 65 views
0

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

下面是我在做什么:

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,我得到以下错误:

[Thu Sep 09 15:44:40 2010: CRITICAL/828]: celerybeat raised exception : 'datetime.timedelta' object has no attribute 'is_due'

它然后关闭。在制作run_every属性时,Celery文档并没有真正讨论返回什么内容,而且我也没有运气搜索Google。芹菜更新日志表示,自1.0.0版以来,它可以在运行时更改周期性任务的时间间隔。

Dev。环境:

  • 的Python 2.6.5
  • 的Django 1.2.1
  • 芹菜2.0.2
+0

因此,run_every由一个必须返回timedelta的单个属性表示。您的代码中的某处必须利用is_due,就像您的错误显示一样。上面的代码似乎应该按预期工作。除非我错过了正在执行is_due的地方。 – nyxtom 2010-09-09 21:32:14

+0

当您将其更改为固定timedelta(而不是使用属性描述符)时,它会工作吗? – cdleary 2010-09-09 22:39:01

+0

是的,然后工作正常。我可以注释掉我创建的属性,并在该类声明下添加run_time = timedelta(秒= 40)。然后我不能改变它:( – Gromer 2010-09-09 23:02:31

回答

3

芹菜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属性将在实例化, 被自动转换,但不晚。

+0

而你是我的英雄! – Gromer 2010-09-10 14:04:17