web-dev-qa-db-fra.com

Comment envoyer des tâches périodiques à une file d'attente spécifique dans Celery

Par défaut, Celery envoie toutes les tâches à la file d'attente "céleri", mais vous pouvez modifier ce comportement en ajoutant un paramètre supplémentaire:

@task(queue='celery_periodic')
def recalc_last_hour():
    log.debug('sending new task')
    recalc_hour.delay(datetime(2013, 1, 1, 2)) # for example

Paramètres du planificateur:

CELERYBEAT_SCHEDULE = {
   'installer_recalc_hour': {
        'task': 'stats.installer.tasks.recalc_last_hour',
        'schedule': 15  # every 15 sec for test
    },
}
CELERYBEAT_SCHEDULER = "djcelery.schedulers.DatabaseScheduler"

Exécuter le travailleur:

python manage.py celery worker -c 1 -Q celery_periodic -B -E

Ce schéma ne fonctionne pas comme prévu: ce programme envoie des tâches périodiques à la file d'attente "céleri", et non "céleri_periodique". Comment puis-je résoudre ce problème?

P.S. céleri == 3.0.16

34
Artem Mezhenin

J'ai trouvé une solution à ce problème:

1) Tout d'abord, j'ai changé la façon de configurer les tâches périodiques. J'ai utilisé @ periodic_task décorateur comme ceci:

@periodic_task(run_every=crontab(minute='5'),
               queue='celery_periodic',
               options={'queue': 'celery_periodic'})
def recalc_last_hour():
    dt = datetime.utcnow()
    prev_hour = datetime(dt.year, dt.month, dt.day, dt.hour) \
                - timedelta(hours=1)
    log.debug('Generating task for hour %s', str(prev_hour))
    recalc_hour.delay(prev_hour)

2) J'ai écrit celery_periodic deux fois en paramètres pour @ periodic_task:

  • queue = 'celery_periodic' option est utilisée lorsque vous appelez la tâche à partir du code (.delay ou .apply_async)

  • options = {'queue': 'celery_periodic'} option est utilisée lorsque battement de céleri l'invoque.

Je suis sûr que la même chose est possible si vous configurez des tâches périodiques avec la variable CELERYBEAT_SCHEDULE.

UPD. Cette solution est correcte pour le stockage basé sur les bases de données et sur les fichiers pour CELERYBEAT_SCHEDULER.

24
Artem Mezhenin

Les céleris sont envoyés aux files d'attente par céleri-battement. Vous pouvez faire tout ce que nous faisons avec céleri api. Voici la liste des configurations livrées avec celerybeat.

http://celery.readthedocs.org/en/latest/userguide/periodic-tasks.html#available-fields

Dans ton cas

CELERYBEAT_SCHEDULE = {
   'installer_recalc_hour': {
        'task': 'stats.installer.tasks.recalc_last_hour',
        'schedule': 15  # every 15 sec for test,
        'options': {'queue' : 'celery_periodic'} ##options are mapped to apply_async options
    },
}
44
abhi shukla

Et si vous utilisez le planificateur de base de données djcelery, vous pouvez spécifier la file d'attente dans le champ Options d'exécution -> file d'attente

2
Mounir