bash for loop em paralelo com n núcleos

0

Eu tenho um loop bash parecido com:

for i in $(seq 0 $max); do
    my_command $i
done

e gostaria de executar isso em paralelo em n cores. Eu sei que eu poderia fazer

while [[ "$j" -le "$max" ]]; do
    for i in $(seq 1 $ncores); do
        my_command $j &
    done
    wait
done

mas se o tempo de execução de my_command for linear em $i , estou perdendo os ciclos da CPU aguardando a função de execução mais longa. Como posso despachar continuamente novos trabalhos para que $ncores trabalhos sejam executados a qualquer momento? Preciso executar um agendador de tarefas real como torque localmente em minha máquina para realizar isso ou posso fazer isso com um simples script bash ?

    
por drjrm3 13.01.2016 / 01:09

2 respostas

0

Use o Paralelo GNU:

seq 0 $max | parallel my_command {}
    
por 13.01.2016 / 12:00
0

ou use xargs:

seq 1 $max | xargs -n1 -P$ncores -I% mycommand %

Para ver como funciona:

seq 1 9 | shuf | xargs -n1 -P3 -I% sh -c 'echo start %; sleep %; echo stop %'
    
por 28.01.2016 / 21:49