Executando vários trabalhadores usando o Aipo

11

Preciso ler do Rabbitmq e executar a tarefa em paralelo usando o Aipo em um único 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] ...

Parece que apenas 1 trabalhador está em execução o tempo todo .. ou seja, um após o outro em ordem seqüencial. Como posso configurar o Celery para executar vários trabalhadores para executar paralelamente?

SrC
fonte

Respostas:

17

Atualizei agora minha resposta após o comentário do MartinP sobre processos filhos geradores de trabalhadores e não threads:

Aipo workere worker processescoisas diferentes ( leia isto para referência ).

Quando um trabalhador é iniciado, gera um certo número de processos filho.

O número padrão desses processos é igual a um número de núcleos nessa máquina.

No Linux, você pode verificar o número de núcleos via:

$ nproc --all

Caso contrário, você pode especificar você mesmo, por exemplo:

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

No exemplo acima, há um trabalhador que poderá gerar 2 processos filhos. Normalmente, é aconselhável executar um único trabalhador por máquina e o valor da simultaneidade definirá quantos processos serão executados em paralelo, mas se vários trabalhadores precisarem executar, você poderá iniciá-los como mostrado abaixo:

$ 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

Consulte os documentos de aipo para obter mais informações

elnurcoot
fonte
3
O parâmetro concurency não executa threads. É executar processos filhos por padrão assim que processar tarefas em paralelo - docs.celeryproject.org/en/latest/reference/...
MartinP
Como a simultaneidade e os threads se relacionam, se a simultaneidade padrão é o número de núcleos da máquina, qual será o número de threads? É configurável?
Thomas John
@ ThomasJohn Acho que o número padrão de threads ainda é o número de núcleos da máquina. Geralmente, você deseja definir o sinalizador --concurrency alto para trabalhadores baseados em encadeamento.
FragLegs 19/09/19
0

Eu encontrei isso

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

Você pode procurar pelas primitivas do Canvas, onde pode ver como criar grupos para execução paralela.

classe celery.group (task1 [, task2 [, task3 [,… taskN]]]) Cria um grupo de tarefas a serem executadas em paralelo.

Caso contrário, uma boa maneira é ir ao canal de IRC e fazer perguntas especiais. Normalmente, existem pessoas que sabem disso muito bem e podem ajudá-lo.

René Höhle
fonte
0

Parece que seu trabalhador está apenas executando um único processo / thread. Você provavelmente só precisa adicionar o argumento --concurrencyou-c ao iniciar o trabalhador para gerar várias instâncias do trabalhador (paralelas).

celery -A proj worker -c 4
Jamie B
fonte