Celerybeat график выполнения задачи несколько раз?
У меня есть задача Calculate_common_locations, которая запускается один раз через CELERYBEAT_SCHEDULE
, Задача просто вызывает функцию в базе данных:
@app.task
def calculate_common_locations():
db.execute("SELECT * FROM calculate_centroids('b')")
Это запись в CELERYBEAT_SCHEDULE
:
CELERYBEAT_SCHEDULE = {
'common_locations': {
'task': 'clients.tasks.calculate_common_locations',
'schedule': crontab(hour=23, day_of_week='sun'), #every week
},
[..]
}
Расписание включает в себя больше задач, которые выполняются один раз в день или каждые 10 секунд. Эти задачи, кажется, не повторяются много раз. Цветочное шоу из сельдерея выполнено более 20 раз. Первый запускается по расписанию, проходит ~100 с, успешно выполняется, а затем запускается снова.
Работает только один сельдерея:
ps -Af | grep celerybeat
foo 24359 779 0 01:53 ? 00:00:04 [celeryd: celery@celery:MainProcess] -active- (worker --beat --app=cloud.celeryapp:app --concurrency=10 -l INFO -s /home/foo/run/celerybeat-schedule --pidfile=/home/foo/run/celerybeat.pid)
Вот как начинается сельдерей (через супервизора):
celery worker --beat --app=cloud.celery app:app --concurrency=10 -l INFO -s /home/foo/run/celerybeat-schedule --pidfile=/home/foo/run/celerybeat.pid
Я проверил это без ключа --concurrency=10. Функция базы данных по-прежнему выполняется несколько раз.
Функция читает из большой таблицы (> 1 Mil строк), которая вставляется в довольно часто (пару раз в секунду). Замки Postgres показывают, что все замки предоставлены.
Возможно ли, что задача повторно запускается, потому что запрос завершается в какой-то момент?
Нет проблем, когда:
- задача запускается из оболочки django (напрямую или через
.delay()
), - содержимое задачи заменяется упрощенным SQL-запросом (выберите * из теста),
- содержимое задания заменяется сном (100).
Версии:
- сельдерей == 3.1.12
- psql (PostgreSQL) 9.3.5
1 ответ
Это может иметь больше смысла, если вы считаете, что crontab(hour=23, day_of_week='sun')
делает:
>>> crontab(hour=23, day_of_week='sun')
<crontab: * 23 sun * * (m/h/d/dM/MY)>
Так что это означает, что задача будет выполняться каждую минуту в 23:00 каждое воскресенье.
Если вы хотите, чтобы он выполнялся только в первую минуту, вы можете указать:
crontab(minute=0, hour=23, day_of_week='sun')