我正在尝试创建一些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
因此,run_every由一个必须返回timedelta的单个属性表示。您的代码中的某处必须利用is_due,就像您的错误显示一样。上面的代码似乎应该按预期工作。除非我错过了正在执行is_due的地方。 – nyxtom 2010-09-09 21:32:14
当您将其更改为固定timedelta(而不是使用属性描述符)时,它会工作吗? – cdleary 2010-09-09 22:39:01
是的,然后工作正常。我可以注释掉我创建的属性,并在该类声明下添加run_time = timedelta(秒= 40)。然后我不能改变它:( – Gromer 2010-09-09 23:02:31