Не удается заставить свойство Celery run_every работать - PullRequest
0 голосов
/ 10 сентября 2010

Я пытаюсь создать некоторые периодические задачи для сельдерея, и некоторые из них должны иметь возможность изменять время выполнения каждый раз во время выполнения.В документации 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 я получаю следующую ошибку:

[Чт, 09 сентября 15:44:40 2010: CRITICAL / 828]: исключение celerybeat: объект datetime.timedelta не имеет атрибута is_due'

Затем он закрывается. Документация по Celery на самом деле не касается того, что возвращать, когда свойство run_every становится свойством, и мне не повезло в поиске в Google. Журналы изменений в Celery говорят, что это удалосьизменить интервал периодической задачи во время выполнения начиная с версии 1.0.0.

Среда разработки:

  • Python 2.6.5
  • Django 1.2.1
  • Сельдерей 2.0.2

1 Ответ

3 голосов
/ 10 сентября 2010

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 будет автоматически преобразован вэкземпляр, но не позже.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...