无法让Celery的run_every属性正常工作
我正在尝试创建一些Celery定时任务,其中有几个任务需要在运行时能够改变执行的时间间隔。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时,出现了以下错误:
[Thu Sep 09 15:44:40 2010: CRITICAL/828]: celerybeat 报错: 'datetime.timedelta'对象没有 'is_due'这个属性
然后它就关闭了。Celery的文档并没有详细说明在将run_every变成属性时应该返回什么,我在谷歌上搜索也没有找到相关的信息。Celery的更新日志说自1.0.0版本以来,它就能在运行时改变定时任务的时间间隔。
开发环境:
- Python 2.6.5
- Django 1.2.1
- Celery 2.0.2
1 个回答
3
Celery 2.0支持不同的调度行为。这里有两个选项:celery.task.schedules.schedule
和celery.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
这个属性在创建的时候会自动转换,但之后就不会再变了。