Como executar x instâncias de um script paralelo?

5

Eu tenho scripts que sempre gostaria de executar instâncias 'x' em paralelo.

O código parece assim:

for A in 
do
  for B in
  do
    (script1.sh $A $B;script2.sh $A $B) &
  done #B
done #A

Os próprios scripts executam consultas de banco de dados, portanto, ele se beneficiaria da execução paralela. Problema é

1) 'espera' não funciona (porque terminou todas as tarefas em segundo plano e inicia novas (mesmo se eu incluir um threadcounter), isso desperdiça muito tempo.

2) Eu não consegui descobrir como fazer paralelo para fazer isso. Eu só encontrei exemplos onde o mesmo script é executado várias vezes, mas não com parâmetros diferentes.

3) a solução alternativa seria:

for A in 
do
  for B in
  do
    while threadcount>X 
    do
      sleep 60
    done
    (script1.sh $A $B;script2.sh $A $B) &
  done #B
done #A

Mas eu não consegui descobrir como confiar na contagem de threads.

Algumas dicas na direção certa são muito bem-vindas.

Eu adoraria usar paralelos, mas a coisa simplesmente não funciona como a documentação me diz.

eu faço

parallel echo ::: A B C ::: D E F

(do documento) e isso me diz

parallel: Input is read from the terminal. Only experts do this on purpose. Press CTRL-D to exit.

e esse é apenas o exemplo mais simples das páginas man.

    
por Chris 24.06.2015 / 02:32

2 respostas

9

Usando o GNU Parallel, é assim:

parallel script1.sh {}';' script2.sh {} ::: a b c ::: d e f

Isso gerará um trabalho por CPU.

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 24.06.2015 / 19:45
1

Acho que você pode fazer isso com xargs:

for A in a b c
do
  for B in d e f
  do
    echo $A $B; done; done | xargs -I {} -P4 bash -c "script1.sh {}; script2.sh {}"

Onde -P4 diz para executar 4 instâncias em paralelo; você terá que especificar algum valor para isso.

    
por 24.06.2015 / 03:00