Я пытаюсь создать некоторые Периодические задачи Сельдерея, и некоторые из них должны иметь возможность изменять время выполнения во время выполнения. Документация 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
Таким образом, run_every представлен одним свойством, которое должно вернуть timedelta. Где-то в вашем коде он должен использовать is_due точно так же, как показывает ваша ошибка. Вышеприведенный код, похоже, должен работать так, как ожидалось. Если я не пропущу что-то о том, где выполняется is_due. – nyxtom
Работает ли он, когда вы меняете его на фиксированный timedelta (вместо использования дескриптора свойства)? – cdleary
Да, отлично работает. Я могу прокомментировать свойство, которое я сделал, и добавить в это объявление класса run_time = timedelta (seconds = 40). Тогда я не могу его изменить :( – Gromer