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é?
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.
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