#!/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
生成参数化的进程数量时,请始终使用worker,并限制可以生成的最大worker数量。
xargs -n | while read
是批量迭代列表的一种简单方法。
seq
创建一个从1到N的数字列表。
xargs -n
将列表分为N / workers + 1个批次。
- 例如N = 100 worker = 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