无法让Celery的run_every属性正常工作

0 投票
1 回答
1168 浏览
提问于 2025-04-16 03:56

我正在尝试创建一些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.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这个属性在创建的时候会自动转换,但之后就不会再变了。

撰写回答