#!/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
Parametrelenmiş sayıda süreç üretirken daima işçileri kullanın ve ortaya çıkabilecek maksimum işçi sayısını sınırlayın .
xargs -n | while read
listelerin toplu olarak yinelenmesinin basit bir yoludur.
seq
1'den N'ye kadar bir sayı listesi oluşturur.
xargs -n
bu listeyi N / işçi + 1 grubuna böler.
- örneğin N = 100 işçi = 10, 1'den 100'e kadar 11 sayıya kadar 10 satır üretecektir.
while read i
her sayı satırını okur.
work ${i} &
work
fonksiyonu sadece ${i}
sayı grubu ile çağırır .
Hata ayıklamak için yorumlanmış hata ayıklama kodu ekledim. Sadece echo
hata ayıklama sürümü ile değiştirin ve hata ayıklama sürümü ile arasındaki kodu # --
ve toplu işlerde nasıl çalıştığını görebilirsiniz. set -x
Bir dosyaya yeniden yönlendirmek isteyebileceğiniz daha ayrıntılı bir hata ayıklama çıktısı için rahatsızlık .
Nasıl çalıştığını izlemek için hata ayıklama sürümünü farklı parametrelerle çalıştırın:
parallel.sh 223 5 1
parallel.sh 223 5 5
parallel.sh 223 5 10
parallel.sh 223 5 20
Yasal Uyarı: Bu kod, min
çalışan işlemler arasındaki değeri eşitlemez . Minimum değeri elde etmek korkunç bir egzersiz değildir. Bu muhtemelen şunları yapar:
parallel.sh 223 5 20 | tr ' ' '\n' | sort -n | head -1
Veya aynısını betiğin kendisine ekleyin:
echo ${arr[*]} | tr ' ' '\n' | sort -n | head -1