faz um loop paralelo

1

Como tornar esse loop paralelo:

for a in $(seq 1 3)
do
  for b in 0.1 0.2 
  do
    echo process with a=$a and b=$b &
  done
done

é em paralelo ou não? Na verdade, quero executar a instrução echo process with a=$a and b=$b em paralelo para cada combinação dos valores a e b Aqui está o resultado de executar o shell acima:

process with a=1 and b=0.1
process with a=2 and b=0.2
process with a=2 and b=0.1
process with a=3 and b=0.2
process with a=3 and b=0.1
process with a=1 and b=0.2

Obrigado.

    
por Belkacem Thiziri 18.04.2017 / 16:52

3 respostas

3

Com o GNU Parallel, é assim:

parallel echo process with a={1} and b={2} ::: 1 2 3 ::: 0.1 0.2 
seq 1 3 | parallel echo process with a={1} and b={2} :::: - ::: 0.1 
parallel echo process with a={1} and b={2} :::: <(seq 1 3) ::: 0.1 0.2

Eu assumo que echo é apenas um exemplo, pois o echo do paralelismo dificilmente vale a pena.

    
por 18.04.2017 / 18:36
0

Se a coisa que você executa no laço interno demorar algum tempo (um echo é muito rápido para ser executado), então, quando os loops iniciarem todos os processos assíncronos, eles estar em execução ao mesmo tempo .

Os loops não são "paralelos".

    
por 18.04.2017 / 17:53
0

Isso deve ter um comentário, mas os comentários são muito pequenos.

Certifique-se de que sua solução funcione para a saída de tamanhos arbitrários e não combine a saída de um trabalho com outro. Aqui está um pequeno exemplo para testar isso:

#!/bin/bash                                                                               

# stress test of parallelizing programs                                                   

longline() {
    # print one big line with 'a's followed by 'b's followed by 'c's                      
    perl -e 'print "@ARGV ", map { "$_"x10000000 } (a..c)' "$@"
    echo
}


echo "Run testprogram in parallel"
for a in $(seq 1 3)
do
    for b in 0.1 0.2
    do
        longline $a $b &
    done
done |
# use 'tr' to compress many 'a's into a single 'a'                                        
# if the output is not 'abc' on every line, lines have been mixed                         
  tr -cs '@'

echo "Run testprogram in serial"
for a in $(seq 1 3)
do
    for b in 0.1 0.2
    do
        longline $a $b
    done
done | tr -cs '@'


echo "Compare with GNU Parallel"
export -f longline
parallel -kj0 longline :::: <(seq 1 3) ::: 0.1 0.2 | tr -cs '@'
    
por 19.04.2017 / 07:54