Esecuzione di più lavoratori tramite sedano


11

Devo leggere da Rabbitmq ed eseguire l'attività in parallelo usando Celery in un unico sistema.

[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] ...

Cucisce solo 1 lavoratore è sempre in esecuzione ... vale a dire uno dopo l'altro in ordine sequenziale. Come posso configurare Celery per eseguire più lavoratori in parallelo?

Risposte:


17

Ora ho aggiornato la mia risposta seguendo il commento di MartinP riguardante i processi figlio che generano i lavoratori e non i thread:

Sedano workere worker processessono cose diverse ( leggi questo per riferimento ).

Quando un lavoratore viene avviato, genera un certo numero di processi figlio.

Il numero predefinito di tali processi è uguale a un numero di core su quella macchina.

Su Linux è possibile verificare il numero di core tramite:

$ nproc --all

Altrimenti puoi specificarlo tu stesso, ad esempio:

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

Nell'esempio sopra c'è un lavoratore che sarà in grado di generare 2 processi figlio. Normalmente si consiglia di eseguire un singolo lavoratore per macchina e il valore di concorrenza definirà quanti processi verranno eseguiti in parallelo, ma se è necessario eseguire più lavoratori, è possibile avviarli come mostrato di seguito:

$ 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

Fare riferimento ai documenti del sedano per maggiori informazioni


3
il parametro di concurency non esegue i thread. Esegue i
MartinP

In che modo la concorrenza e i thread sono in relazione tra loro, se la concorrenza predefinita è il numero di core della macchina, quale sarà il numero di thread? È configurabile?
Thomas John,

@ThomasJohn Penso che il numero predefinito per i thread sia ancora il numero di core della macchina. In generale, ti consigliamo di impostare il flag --concurrency in alto per i lavoratori basati su thread.
FragLegs,

0

Ho trovato questo

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

Puoi cercare le primitive di Canvas lì dove puoi vedere come creare gruppi per l'esecuzione parallela.

class celery.group (task1 [, task2 [, task3 [, ... taskN]]]) Crea un gruppo di attività da eseguire in parallelo.

Altrimenti un buon modo è quello di andare sul canale IRC e porre domande speciali. Normalmente ci sono persone che lo sanno molto bene e possono aiutarti.


0

Sembra che il tuo lavoratore stia semplicemente eseguendo un singolo processo / thread. Probabilmente devi solo aggiungere l' argomento --concurrencyo-c quando avvii il lavoratore per generare più istanze di lavoro (parallele).

celery -A proj worker -c 4
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.