Периодические задания Celerybeat выполняются несколько раз, если они застряли за длительным заданием
Я использую Celery 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 выполняется в течение двух часов, то последующие задачи будут выполняться по несколько раз каждая. Если я перезапущу сельдерей и сельдерея, иногда у него все еще есть сверхурочные задачи, а иногда нет.
Это меня сильно смутило. Некоторое время я читал документы по сельдерею, но не мог понять, почему. Может кто-нибудь сказать мне, почему это происходит, как сельдерей управляет своим сообщением и задачей, если очередь задач заблокирована или сельдерей перезапущен?
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