Celery - планировать периодические задачи, запускающиеся в определенное время

Каков наилучший способ запланировать периодическую задачу, начиная с определенной даты и времени?

(Я не использую cron для этого, учитывая, что мне нужно запланировать около сотни удаленных rsync, где я вычисляю удаленное и локальное смещение, и мне нужно будет rsync каждый путь в секунду, когда журналы генерируется на каждом хосте.)

Насколько я понимаю, класс celery.task.schedules crontab позволяет указывать только час, минуту, день недели. Самый полезный совет, который я нашел до сих пор, был этот ответ от nosklo.

Это лучшее решение? Я использую неправильный инструмент для работы?


person Joao Figueiredo    schedule 21.10.2011    source источник


Ответы (2)


Celery кажется хорошим решением для вашей проблемы с планированием: периодические задачи Celery имеют разрешение времени выполнения в секундах.

Здесь вы используете подходящий инструмент, но запись в crontab — это не то, что вам нужно. Вы хотите использовать объект python datetime.timedelta; Планировщик crontab в celery.schedules имеет только минутное разрешение, но использование timedelta для настройки интервала PeriodicTask обеспечивает более функциональные возможности, в данном случае разрешение в секунду.

например из документов сельдерея

>>> from celery.task import tasks, PeriodicTask
>>> from datetime import timedelta
>>> class EveryThirtySecondsTask(PeriodicTask):
...     run_every = timedelta(seconds=30)
...
...     def run(self, **kwargs):
...         logger = self.get_logger(**kwargs)
...         logger.info("Execute every 30 seconds")

http://ask.github.com/celery/reference/celery.task.base.html#celery.task.base.PeriodicTask

class datetime.timedelta(days=0, seconds=0, microseconds=0, milliseconds=0, minutes=0, hours=0, weeks=0)

Единственная проблема здесь заключается в том, что вы должны описать частоту, с которой вы хотите, чтобы эта задача выполнялась, а не то, в какое время вы хотите, чтобы она выполнялась; тем не менее, я бы посоветовал вам ознакомиться с Advanced Python Scheduler http://packages.python.org/APScheduler/.

Похоже, что Advanced Python Scheduler можно легко использовать для запуска обычных (то есть непериодических) задач Celery по любому расписанию по вашему выбору, используя его собственные функции планирования.

person bakennedy    schedule 26.10.2011
comment
Спасибо бакеннеди. Я я использую APScheduler, просто проверял Celery, чтобы посмотреть, смогу ли я улучшить свою текущую систему. Я уже читал страницу PeriodicTask, но хотя она позволяет указать частоту выполнения задачи, она не указывает, когда она будет запущена. - person Joao Figueiredo; 27.10.2011
comment
Моя текущая настройка: демонизированный APScheduler, который считывает, какие задачи он будет запускать (время начала, частота, process_to_call) из файла .cfg. Проблема в том, что я должен SIGKILL демона каждый раз, когда есть какие-либо изменения в задаче (смещение между моим локальным сервером и генерацией удаленного журнала теперь другое; мне нужна другая частота; аргументы процесса изменились), видя, что APScheduler ShelveJobStore позволяет только обновления из основного цикла (и, например, не перезагружает файл ShelveJobStore), что противоречит цели демона. - person Joao Figueiredo; 27.10.2011
comment
Ах, я неправильно понял APScheduler и подумал, что это просто библиотека времени для запланированного отложенного выполнения задачи из какой-то программы, а не демон планирования и система управления заданиями. С сельдереем больше совпадений, чем я думал; тем не менее, celery по-прежнему является превосходным инструментом управления задачами, особенно если ваши задания достаточно велики, чтобы их нужно было распределить между отдельными рабочими узлами. - person bakennedy; 27.10.2011
comment
PeriodicTask кажется устаревшим. - person Alper; 12.02.2013
comment
@alper У вас есть больше информации об этом? - person jeverling; 04.04.2013

Недавно я работал над задачей, связанной с Celery, и мне пришлось использовать ее для асинхронной работы, а также для запланированных задач. Достаточно сказать, что я вернулся к старому crontab для запланированной задачи, хотя он вызывает скрипт Python, который порождает отдельную асинхронную задачу. Таким образом, мне меньше приходится поддерживать crontab (чтобы запустить планировщик Celery, требуется дополнительная настройка), но я полностью использую асинхронные возможности Celery.

person user83768    schedule 21.10.2011
comment
Если вы все равно используете celery, почему бы не запустить его с помощью beat и не использовать планирование crontab? - person Alper; 05.04.2013