#!/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
Luôn sử dụng công nhân khi sinh ra một số lượng quy trình được tham số hóa và giới hạn số lượng công nhân tối đa có thể sinh sản .
xargs -n | while read
là một phương tiện đơn giản để lặp lại danh sách theo đợt.
seq
tạo một danh sách các số từ 1 đến N.
xargs -n
chia danh sách đó thành N / worker + 1 đợt.
- ví dụ: N = 100 worker = 10 sẽ tạo ra 10 dòng có tối đa 11 số từ 1 đến 100.
while read i
đọc từng dòng số.
work ${i} &
chỉ cần gọi work
hàm với số ${i}
lô.
Để gỡ lỗi tôi đã thêm mã gỡ lỗi nhận xét. Chỉ cần thay thế echo
bằng phiên bản gỡ lỗi và mã giữa # --
với phiên bản gỡ lỗi của nó và bạn có thể thấy nó hoạt động như thế nào trên các lô. Uncomment set -x
cho một đầu ra gỡ lỗi chi tiết hơn mà bạn có thể muốn chuyển hướng đến một tập tin.
Chỉ cần chạy phiên bản gỡ lỗi với các tham số khác nhau để xem cách nó hoạt động:
parallel.sh 223 5 1
parallel.sh 223 5 5
parallel.sh 223 5 10
parallel.sh 223 5 20
Tuyên bố miễn trừ trách nhiệm: Mã này không đồng bộ hóa min
giá trị giữa các quy trình worker. Lấy giá trị tối thiểu không phải là một bài tập kinh khủng. Điều này có thể sẽ làm:
parallel.sh 223 5 20 | tr ' ' '\n' | sort -n | head -1
Hoặc chỉ cần thêm tương tự vào chính kịch bản:
echo ${arr[*]} | tr ' ' '\n' | sort -n | head -1