#!/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 до Н.
xargs -n
розбиває цей список на 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