#!/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
Всегда используйте рабочих при порождении параметризованного числа процессов и ограничивайте максимальное количество рабочих, которые могут появиться .
xargs -n | while read
это простой способ перебора списков в пакетном режиме.
seq
создает список чисел от 1 до N.
xargs -n
разбивает этот список на н / работников + 1 пакет.
- например, N = 100 работников = 10 будет производить 10 строк до 11 чисел от 1 до 100.
while read i
читает каждую строку чисел.
work ${i} &
просто вызывает work
функцию с ${i}
партией чисел.
Для отладки я добавил закомментированный код отладки. Просто замените его echo
на отладочную версию, а код - # --
на отладочную версию, и вы увидите, как он работает в пакетном режиме. Раскомментируйте set -x
более подробный отладочный вывод, который вы можете перенаправить в файл.
Просто запустите отладочную версию с другими параметрами, чтобы посмотреть, как она работает:
parallel.sh 223 5 1
parallel.sh 223 5 5
parallel.sh 223 5 10
parallel.sh 223 5 20
Отказ от ответственности: этот код не синхронизирует min
значение между рабочими процессами. Получение минимального значения не является ужасным упражнением. Это, вероятно, сделает:
parallel.sh 223 5 20 | tr ' ' '\n' | sort -n | head -1
Или просто добавьте то же самое в сам скрипт:
echo ${arr[*]} | tr ' ' '\n' | sort -n | head -1