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