2

私の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 を再起動すると、残業タスクがまだ残っている場合とそうでない場合があります。

それは私をとても混乱させました。セロリのドキュメントをしばらく読んでいましたが、理由がわかりませんでした。なぜこれが起こるのか、タスクキューがブロックされているかセロリが再起動されている場合、セロリがメッセージとタスクをどのように管理するか教えてもらえますか?

4

1 に答える 1

0

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
于 2016-04-08T04:02:23.523 に答える