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

11

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?

SrC
la source

Réponses:

17

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

Le céleri workeret worker processessont 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

Référez-vous à la documentation de céleri pour plus d'informations

elnurcoot
la source
3
Le paramètre de concordance n'exécute pas les threads. Il exécute les processus enfants par défaut afin de traiter les tâches en parallèle - docs.celryproject.org/en/latest/reference/…
MartinP
Comment la concurrence et les threads sont-ils liés, si la concurrence par défaut est le nombre de cœurs de la machine, quel sera le nombre de threads? Est-il configurable?
Thomas John
@ThomasJohn Je pense que le nombre par défaut pour les threads est toujours le nombre de cœurs de la machine. En règle générale, vous souhaiterez définir l'indicateur --concurrency élevé pour les travailleurs basés sur les threads.
FragLegs
0

J'ai trouvé ça

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

Vous pouvez y rechercher des primitives Canvas , 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 qui peuvent vous aider.

René Höhle
la source
0

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

celery -A proj worker -c 4
Jamie B
la source