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')
Другие вопросы по тегам