#!/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
Selalu gunakan pekerja saat menelurkan jumlah proses berparameter dan batasi jumlah maksimum pekerja yang bisa muncul .
xargs -n | while read
adalah cara sederhana daftar iterasi dalam batch.
seq
membuat daftar angka dari 1 hingga N.
xargs -n
memecah daftar itu menjadi N / pekerja + 1 batch.
- misal N = 100 pekerja = 10 akan menghasilkan 10 baris hingga 11 angka dari 1 hingga 100.
while read i
membaca setiap baris angka.
work ${i} &
hanya memanggil work
fungsi dengan ${i}
sejumlah angka.
Untuk debug saya telah menambahkan kode debug komentar. Cukup ganti echo
dengan versi debug dan kode antara # --
dengan versi debug-nya dan Anda dapat melihat cara kerjanya pada batch. Batalkan komentar set -x
untuk hasil debug yang lebih terperinci yang mungkin ingin Anda redirect ke file.
Jalankan saja versi debug dengan parameter berbeda untuk melihat bagaimana operasinya:
parallel.sh 223 5 1
parallel.sh 223 5 5
parallel.sh 223 5 10
parallel.sh 223 5 20
Penafian: Kode ini tidak menyinkronkan min
nilai antara proses pekerja. Mendapatkan nilai minimum bukanlah latihan yang mengerikan. Ini mungkin akan dilakukan:
parallel.sh 223 5 20 | tr ' ' '\n' | sort -n | head -1
Atau cukup tambahkan yang sama ke skrip itu sendiri:
echo ${arr[*]} | tr ' ' '\n' | sort -n | head -1