Django芹菜:安排重复任务,但具有固定的开始日期

时间:2016-02-13 07:07:16

标签: django celery django-celery celery-task

目前djcelery允许我通过PeriodicTask模型安排重复任务。例如,一个像每分钟一样的间隔运行的任务,或者像crontab一样指定的间隔,就像每个月的第一个月中午一样。然而,我真正想要做的是安排一个固定日期的任务,然后在一段时间内重复。例如,首先在2016年3月3日2:00运行,然后每小时运行一次。

有没有办法在django和芹菜(有或没有djcelery)中实现这个目标?感谢

1 个答案:

答案 0 :(得分:4)

正如the docs中所述,您可以实现自己的自定义调度程序。您应该覆盖is_due方法,该方法决定是否该时间来运行任务。

下面是一个概念验证(我还没有检查过它的错误)。请注意,__reduce__方法也被覆盖,以便新参数也被序列化。

import celery.schedules.schedule

class myschedule(celery.schedules.schedule):

    def __init__(self, *args, **kwargs):
        super(myschedule, self).__init__(*args, **kwargs)
        self.start_date = kwargs.get('start_date', None)

    def is_due(self, last_run_at):
        if self.start_date is not None and self.now() < self.start_date:
            return (False, 20)  # try again in 20 seconds
        return super(myschedule, self).is_due(last_run_at)

    def __reduce__(self):
        return self.__class__, (self.run_every, self.relative, self.nowfun, self.start_date)

然后你在配置中使用它:

CELERYBEAT_SCHEDULE = {
    'add-every-30-seconds': {
        'task': 'tasks.add',
        'schedule': myschedule(timedelta(seconds=30), start_date=start_date),
        'args': (16, 16)
    },
}