私のdjangoプログラムでは、セロリ3.1.17とredisをブローカーバージョン3.0.2として使用しています。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': ()
},
}
問題は次のとおりです。
次のタスクの予定時刻より前にタスクが終了すれば、問題なく動作します。ただし、タスクが長時間実行される場合、たとえば task1 が 2 時間実行されると、後のタスクがそれぞれ数回実行されます。celery と celerybeat を再起動すると、残業タスクがまだ残っている場合とそうでない場合があります。
それは私をとても混乱させました。セロリのドキュメントをしばらく読んでいましたが、理由がわかりませんでした。なぜこれが起こるのか、タスクキューがブロックされているかセロリが再起動されている場合、セロリがメッセージとタスクをどのように管理するか教えてもらえますか?