#!/bin/bash
# set -x # debug version
N=${1:-123}
n=${2:-45}
workers=${workers:-${3:-10}}
((workers < 1)) && ((workers = 1))
((workers > 20)) && ((workers = 20))
((min=100000000000000)) #set min to some garbage value
work() {
for i in ${*}; do
for (( j=1; j<=${n}; j++ )); do
val=$(/path/to/a.out)
val2=$(echo ${val} | bc)
(( val2 < min )) && (( min = val2 ));
done
echo ${min}
# # debug version
# echo ${i} ${j} ${min}
done
}
# --
arr=($(
seq ${N} | xargs -n$[N/workers + 1] | while read i; do
work ${i} &
done
wait
))
echo ${arr[*]}
# --
# # debug version
# seq ${N} | xargs -t -n$[N/workers + 1] | while read i; do
# work ${i} &
# done
# wait
Siempre use trabajadores cuando genere un número de procesos parametrizado y limite el número máximo de trabajadores que pueden generar .
xargs -n | while read
es un medio simple de iterar listas en lotes.
seq
crea una lista de números del 1 al N.
xargs -n
divide esa lista en N / trabajadores + 1 lotes.
- por ejemplo, N = 100 trabajadores = 10 producirá 10 líneas de hasta 11 números del 1 al 100.
while read i
lee cada línea de números.
work ${i} &
solo llama a la work
función con un ${i}
lote de números.
Para depurar, agregué un código de depuración comentado. Simplemente reemplace la echo
con la versión de depuración y el código intermedio # --
con su versión de depuración y podrá ver cómo funciona en lotes. Elimine el comentario set -x
de una salida de depuración más detallada que quizás desee redirigir a un archivo.
Simplemente ejecute la versión de depuración con diferentes parámetros para ver cómo funciona:
parallel.sh 223 5 1
parallel.sh 223 5 5
parallel.sh 223 5 10
parallel.sh 223 5 20
Descargo de responsabilidad: este código no sincroniza el min
valor entre los procesos de trabajo. Obtener el valor mínimo no es un ejercicio horrible. Esto probablemente hará:
parallel.sh 223 5 20 | tr ' ' '\n' | sort -n | head -1
O simplemente agregue lo mismo al script en sí:
echo ${arr[*]} | tr ' ' '\n' | sort -n | head -1