2016-04-08 2 views
1

J'utilise célery 3.1.17 et redis comme courtier version 3.0.2 dans mon programme django. Il fonctionne sur Ubuntu 14.04.Tâches périodiques Celerybeat exécutées plusieurs fois si bloquées derrière une tâche de longue durée

Dans les paramètres, je définis le CELERYBEAT_SCHEDULE comme:

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':() 
    }, 
} 

est le problème ici:

Si les tâches terminées avant l'heure prévue de la tâche suivante, il fonctionne bien. Mais si une tâche dure longtemps, par exemple, task1 s'exécute pendant deux heures, alors les tâches suivantes s'exécuteront plusieurs fois chacune. Si je redémarre le céleri et le céleri, il y a parfois des tâches supplémentaires, mais parfois non.

Ça m'a beaucoup dérouté. J'ai lu les docs de céleri pendant un moment, mais je n'ai pas compris pourquoi. Quelqu'un pourrait-il me dire pourquoi cela se produit, comment le céleri gère son message et sa tâche si la file d'attente des tâches est bloquée ou si le céleri est redémarré?

Répondre

0

Dans settings.py ajouter la configuration

''' 
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