#!/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 1 से 100 तक 11 संख्याओं की 10 रेखाएँ निर्मित करेगा।
while read i
संख्याओं की प्रत्येक पंक्ति को पढ़ता है।
work ${i} &
बस संख्या के बैच के work
साथ फ़ंक्शन को कॉल करता है ${i}
।
डिबग करने के लिए मैंने कमेंट-आउट डिबग कोड जोड़ा है। बस echo
डिबग संस्करण के # --
साथ कोड और इसके डिबग संस्करण के बीच के कोड को बदलें और आप देख सकते हैं कि यह बैचों पर कैसे काम करता है। set -x
अधिक विस्तृत डीबग आउटपुट के लिए Uncomment , जिसे आप किसी फ़ाइल पर रीडायरेक्ट करना चाहते हैं।
डिबग संस्करण को चलाने के लिए विभिन्न मापदंडों के साथ यह देखें कि यह कैसे संचालित होता है:
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