Как я могу запланировать выполнение задачи в определенное время с помощью сельдерея?

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


person Hank Gay    schedule 02.01.2010    source источник


Ответы (5)


Недавно выпущенная версия 1.0.3 теперь поддерживает это, спасибо Патрику Альтману!

Пример:

from celery.task.schedules import crontab
from celery.decorators import periodic_task

@periodic_task(run_every=crontab(hour=7, minute=30, day_of_week="mon"))
def every_monday_morning():
    print("This runs every Monday morning at 7:30a.m.")

Смотрите журнал изменений для получения дополнительной информации:

http://celeryproject.org/docs/changelog.html

person asksol    schedule 22.01.2010
comment
Пути импорта изменены на from celery.task import periodic_task и from celery.schedules import crontab. - person hughes; 01.03.2013

Использовать

YourTask.apply_async(args=[some, args, here], eta=when)

И в конце вашей задачи перенесите ее на следующий раз, когда она должна выполняться.

person nosklo    schedule 02.01.2010
comment
не забывайте, что eta - это дата и время питона, - person diegueus9; 02.01.2010
comment
Если я сделаю это PeriodicTask, мне нужно запланировать его только в первый раз, верно? - person Hank Gay; 02.01.2010

Я только что отправил патч, чтобы добавить ScheduledTask для выполнения небольшого планирования на основе времени по сравнению с периодом:

https://github.com/celery/celery/commit/e8835f1052bb45a73f9404005c666f92d28b9a>

person Patrick Altman    schedule 13.05.2010

Как вы можете прочитать в этом руководстве, вы можете создать PeriodicTask, я думаю если вы выполнили задачу в час ночи. Утро понедельника, потому что вы хотите запустить длинную операцию cpu/mem, помните, что сельдерей использует ampq для задач постановки в очередь.

person diegueus9    schedule 02.01.2010

Хотя ответ @asksol остается в силе, API был обновлен. Для celery 4.1.0 мне нужно импортировать crontab и periodic_task следующим образом:

from celery.schedules import crontab
from celery.task import periodic_task
person Psidom    schedule 09.11.2017