2010-09-09 3 views
0

Я пытаюсь создать некоторые Периодические задачи Сельдерея, и некоторые из них должны иметь возможность изменять время выполнения во время выполнения. Документация Celery говорит, что я должен это сделать, превратив атрибут run_every в свойство (http://packages.python.org/celery/faq.html#can-i-change-the-interval-of-a-periodic-task-at-runtime).Не удается получить свойство Celery run_every для работы

Вот что я делаю:

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 raised exception : 'datetime.timedelta' object has no attribute 'is_due'

Он затем выключается. Документация Celery действительно не вписывается в то, что нужно вернуть при создании свойства run_every, и мне не повезло найти Google. Изменения в сельдереях говорят, что он смог изменить интервалы Периодической задачи во время выполнения с версии 1.0.0.

Дев. Окружающая среда:

  • Python 2.6.5
  • Django 1.2.1
  • сельдерея 2.0.2
+0

Таким образом, run_every представлен одним свойством, которое должно вернуть timedelta. Где-то в вашем коде он должен использовать is_due точно так же, как показывает ваша ошибка. Вышеприведенный код, похоже, должен работать так, как ожидалось. Если я не пропущу что-то о том, где выполняется is_due. – nyxtom

+0

Работает ли он, когда вы меняете его на фиксированный timedelta (вместо использования дескриптора свойства)? – cdleary

+0

Да, отлично работает. Я могу прокомментировать свойство, которое я сделал, и добавить в это объявление класса run_time = timedelta (seconds = 40). Тогда я не могу его изменить :( – Gromer

ответ

3

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

+0

И ты мой герой! – Gromer

 Смежные вопросы

  • Нет связанных вопросов^_^