Executa o loop de shell em paralelo, mas apenas N workers

2

Temos mais de 100 git repos e, às vezes, quero grep acima de tudo.

Para atualizar os repositórios eu uso isso:

for repo in *; do (cd $repo; git checkout master; git pull); done

Isso é muito lento.

Como acelerar isso?

A execução de todas as atualizações de uma vez geraria muitos processos.

Eu preciso de uma maneira de reduzir a carga para N trabalhadores.

Alguém tem uma solução para isso?

    
por guettli 08.07.2015 / 10:25

3 respostas

3

Você pode usar xargs para fazer o trabalho, por exemplo

(for repo in *
    do
    [ -d ${repo} ] && echo ${repo}
    done ) | xargs -I{} -P4 ./gitActions.sh {}

O sinalizador -P4 diz ao xargs para executar até 4 processos simultâneos para que você possa brincar com o número de processos que deseja / precisa.

Então o seu arquivo gitActions.sh deve conter:

#!/bin/bash
repo=$1
cd $repo; git checkout master; git pull
    
por 08.07.2015 / 11:38
3

Você pode usar o GNU paralelo para fazer esta tarefa. Da página inicial do GNU paralelo,

"Um trabalho também pode ser um comando que lê de um pipe. O GNU paralelo pode então dividir a entrada e canalizá-la em comandos em paralelo."

Existe um excelente tutorial e esta seção específica aborda exatamente o que você perguntou.

Edit: Aqui está o comando que você pode usar. (Ligeiramente modificado da resposta de Ole Tang)

parallel -j<number of jobs to run> 'cd {} && git checkout master && git pull' ::: */

Isso ativará o "número de tarefas" paralelo que você especificou e executará o que tiver solicitado.

HTH

    
por 09.07.2015 / 10:16
2

Usando o GNU Parallel, é assim:

parallel -j77 'cd {} && git checkout master && git pull' ::: */ 

Dá 77 trabalhadores.

O GNU Parallel é um paralelizador geral e facilita a execução de trabalhos em paralelo na mesma máquina ou em várias máquinas para as quais você tem acesso ssh. Muitas vezes, pode substituir um loop for .

Se você tem 32 tarefas diferentes que você quer rodar em 4 CPUs, uma forma direta de paralelizar é rodar 8 tarefas em cada processador:

O

GNUParallelgeraumnovoprocessoquandoumtermina-mantendoasCPUsativaseeconomizandotempo:

Instalação

Se o GNU Parallel não for empacotado para sua distribuição, você poderá fazer uma instalação pessoal, que não requer acesso root. Isso pode ser feito em 10 segundos ao fazer isso:

(wget -O - pi.dk/3 || curl pi.dk/3/ || fetch -o - http://pi.dk/3) | bash

Para outras opções de instalação, consulte o link

Saiba mais

Veja mais exemplos: link

Assista aos vídeos de introdução: link

Percorra o tutorial: link

Inscreva-se na lista de e-mail para obter suporte: link

    
por 09.07.2015 / 23:39