我正在尝试创建一些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的间隔。
开发。环境:
答案 0 :(得分: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
属性将在实例化时自动转换,
但不是以后。