Периодические задачи Celerybeat выполняются несколько раз, если они застряли за долго выполняющейся задачей

Я использую сельдерей 3.1.17 и Redis в качестве брокера версии 3.0.2 в моей программе django. Он работает на Ubuntu 14.04.

В настройках я определил CELERYBEAT_SCHEDULE как:

CELERYBEAT_SCHEDULE = {
    'task1': {
        'task': 'api.tasks.exsample.task1',
        'schedule': crontab(hour=1, minute=0),
        'args': ()
    },
    'task2': {
        'task': 'api.tasks.exsample.task2',
        'schedule': crontab(hour=1, minute=30),
        'args': ()
    },
    'task3': {
        'task': 'api.tasks.exsample.task3',
        'schedule': crontab(hour=2, minute=0),
        'args': ()
    },
    'task4': {
        'task': 'api.tasks.exsample.task4',
        'schedule': crontab(hour=2, minute=30),
        'args': ()
    },
    'task5': {
        'task': 'api.tasks.exsample.task5',
        'schedule': crontab(hour=2, minute=40),
        'args': ()
    },
    'task6': {
        'task': ''api.tasks.exsample.task6',
        'schedule': crontab(hour=2, minute=50),
        'args': ()
    },
}

Вот проблема:

Если задачи завершаются до запланированного времени следующей задачи, все работает нормально. Но если задача выполняется долго, скажем, задача 1 выполняется два часа, то последующие задачи будут выполняться по несколько раз каждая. Если я перезапускаю celery и celerybeat, иногда у него все еще есть сверхурочные задачи, а иногда нет.

Меня это очень смутило. Я некоторое время читал документы сельдерея, но не мог понять, почему. Может ли кто-нибудь сказать мне, почему это происходит, как сельдерей управляет своим сообщением и задачей, если очередь задач заблокирована или сельдерей перезапущен?


person Abuu    schedule 08.04.2016    source источник


Ответы (1)


В settings.py добавить дополнительные настройки

'''
Task hard time limit in seconds.
The worker processing the task will be killed and replaced with a new one when this is exceeded.
'''
CELERYD_TASK_TIME_LIMIT = 86400
# CELERYD_TASK_TIME_LIMIT = 10
'''
Task soft time limit in seconds.
The SoftTimeLimitExceeded exception will be raised when this is exceeded. The task can catch this to e.g.
clean up before the hard time limit comes.
'''
CELERYD_TASK_SOFT_TIME_LIMIT = 80000
person Sơn Lâm    schedule 08.04.2016