web-dev-qa-db-fra.com

Comment conserver plusieurs files d'attente de céleri indépendantes?

J'essaie de conserver plusieurs files d'attente de céleri avec différentes tâches et travailleurs dans la même base de données redis. Vraiment juste un problème de commodité de ne vouloir qu'un seul serveur redis au lieu de deux sur ma machine.

J'ai suivi mot à mot les documents du tutoriel sur le céleri, car c'était le seul moyen de le faire fonctionner pour moi. Maintenant, lorsque j'essaie de tout dupliquer avec des noms/files d'attente légèrement modifiés, cela continue de générer des erreurs.

Remarque - Je suis un nouveau pour Python et Céleri, ce qui est évidemment une partie du problème. Je ne sais pas quelles parties sont nommées "tâche/tâches" en tant que nom par rapport à des mots spéciaux.

Ma version condensée de documents: exécutez celery -A tasks worker Pour générer les travailleurs. tasks.py contient un code de tâche avec celery = Celery('tasks', broker='redis://localhost') pour se connecter à Celery et @task() au-dessus de mes fonctions que je veux retarder.

Dans mon programme pour les tâches de mise en file d'attente ...

from tasks import do_work
do_work.delay()

Donc, compte tenu de tout ce qui précède, quelles sont les étapes à suivre pour transformer cela en deux types de tâches qui s'exécutent indépendamment sur des files d'attente et des travailleurs distincts? Par exemple, blue_tasks et red_tasks?

J'ai essayé de changer toutes les instances de tâches en blue_tasks ou red_tasks. Cependant, lorsque je fais la queue blue_tasks, les travailleurs red_tasks que j'ai démarrés commencent à travailler dessus.

J'ai lu sur les files d'attente par défaut et autres, j'ai donc essayé ce code, qui ne fonctionnait pas:

CELERY_DEFAULT_QUEUE = 'red'
CELERY_QUEUES = (
    Queue('red', Exchange('red'), routing_key='red'),
)

En guise de remarque, je ne comprends pas pourquoi celery worker Des erreurs avec le céleri essayant de se connecter à une instance amqp par défaut, tandis que celery -A tasks worker Dit au céleri de se connecter à Redis. Quel code de tâche celery worker Tente-t-il d'exécuter sur le travailleur si rien n'a été spécifié?

31
jwoww

Par défaut, tout va dans une file d'attente par défaut nommée celery (et c'est ce que celery worker sera traité si aucune file d'attente n'est spécifiée)

Alors dites que vous avez votre do_work fonction de tâche dans Django_project_root/myapp/tasks.py.

Vous pouvez configurer le do_work tâche de vivre dans sa propre file d'attente comme ceci:

CELERY_ROUTES = {
    'myproject.tasks.do_work': {'queue': 'red'},
}

Exécutez ensuite un travailleur en utilisant celery worker -Q red et il ne traitera que les éléments de cette file d'attente (un autre travailleur appelé avec celery worker ne ramassera que les choses dans la file d'attente par défaut)

La section routage des tâches de la documentation devrait tout expliquer.

49
dbr

Pour créer un lien dynamique vers une autre file d'attente, procédez comme suit:

1) Spécifiez le nom de la file d'attente avec l'attribut 'file d'attente'

celery.send_task('job1', args=[], kwargs={}, queue='queue_name_1')
celery.send_task('job1', args=[], kwargs={}, queue='queue_name_2')

(Ici, un travail particulier utilise deux files d'attente)

2) Ajoutez l'entrée suivante dans le fichier de configuration

CELERY_CREATE_MISSING_QUEUES = True

3) Lors du démarrage de l'ouvrier, utilisez -Q pour spécifier le nom de la file d'attente 'à partir de laquelle les travaux à consommer

celery -A proj worker -l info -Q queue1 
celery -A proj worker -l info -Q queue2
15
josepainumkal