web-dev-qa-db-fra.com

Exécution de plusieurs employés à l'aide de Celery

J'ai besoin de lire depuis Rabbitmq et d'exécuter la tâche en parallèle en utilisant Celery dans un seul système.

[2014-12-30 15:54:22,374: INFO/Worker-1] ...   
[2014-12-30 15:54:23,401: INFO/Worker-1] ...
[2014-12-30 15:54:30,878: INFO/Worker-1] ...
[2014-12-30 15:54:32,209: INFO/Worker-1] ...
[2014-12-30 15:54:33,255: INFO/Worker-1] ...
[2014-12-30 15:54:48,445: INFO/Worker-1] ...
[2014-12-30 15:54:49,811: INFO/Worker-1] ...
[2014-12-30 15:54:50,903: INFO/Worker-1] ...
[2014-12-30 15:55:39,674: INFO/Worker-1] ...
[2014-12-30 15:55:41,024: INFO/Worker-1] ...
[2014-12-30 15:55:42,147: INFO/Worker-1] ...

Il ne coule qu'un seul travailleur fonctionne tout le temps .. c'est-à-dire l'un après l'autre dans un ordre séquentiel. Comment puis-je configurer Celery pour exécuter plusieurs travailleurs pour exécuter en parallèle?

11
SrC

J'ai maintenant mis à jour ma réponse suite au commentaire de MartinP concernant les processus fils de génération de travailleurs et non les threads:

Céleri worker et worker processes sont des choses différentes ( Lisez ceci pour référence ).

Lorsqu'un travailleur est démarré, il génère alors un certain nombre de processus enfants.

Le nombre par défaut de ces processus est égal à un certain nombre de cœurs sur cette machine.

Sous Linux, vous pouvez vérifier le nombre de cœurs via:

$ nproc --all

Sinon, vous pouvez le spécifier vous-même, par exemple:

$ celery -A proj worker --loglevel=INFO --concurrency=2

Dans l'exemple ci-dessus, il y a un travailleur qui pourra générer 2 processus enfants. Il est normalement conseillé d'exécuter un seul travailleur par machine et la valeur de concurrence définira le nombre de processus à exécuter en parallèle, mais si plusieurs travailleurs doivent être exécutés, vous pouvez les démarrer comme indiqué ci-dessous:

$ celery -A proj worker -l info --concurrency=4 -n wkr1@hostname
$ celery -A proj worker -l info --concurrency=2 -n wkr2@hostname
$ celery -A proj worker -l info --concurrency=2 -n wkr3@hostname

Reportez-vous à céleri docs pour plus d'informations

17
elnurcoot

J'ai trouvé ça

http://docs.celryproject.org/en/latest/reference/celery.html?highlight=parallel

Vous pouvez rechercher les primitives Canvas là où vous pouvez voir comment créer des groupes pour une exécution parallèle.

classe celery.group (task1 [ task2 [ task3 [… taskN]]]) Crée un groupe de tâches à exécuter en parallèle.

Sinon, un bon moyen est d'aller sur le canal IRC et de poser des questions spéciales. Normalement, il y a des gens qui savent très bien et ils peuvent vous aider.

0
René Höhle

Il semble que votre travailleur exécute simplement un seul processus/thread. Vous avez probablement juste besoin d'ajouter le --concurrency ou -c argument lors du démarrage du travailleur pour générer plusieurs instances de travail (parallèles).

celery -A proj worker -c 4
0
Jamie B