Use o Paralelo GNU:
seq 0 $max | parallel my_command {}
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
?
Use o Paralelo GNU:
seq 0 $max | parallel my_command {}
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 %'
Tags bash linux parallel-processing