#!/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
해당 목록을 N / workers + 1 배치로 나눕니다.
- 예를 들어 N = 100 근로자 = 10은 1에서 100까지 11 개의 숫자로 10 줄을 생성합니다.
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