#!/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 / คนงาน + 1 แบตช์
- เช่น N = 100 คนงาน = 10 จะสร้าง 10 บรรทัดของจำนวนมากถึง 11 หมายเลขจาก 1 ถึง 100
while read i
อ่านตัวเลขแต่ละบรรทัด
work ${i} &
เพียงแค่เรียกwork
ฟังก์ชั่นด้วย${i}
ชุดของตัวเลข
ในการแก้ไขปัญหาฉันได้เพิ่มรหัสการดีบักความคิดเห็น เพียงแค่แทนที่echo
ด้วยเวอร์ชันการตรวจแก้จุดบกพร่องและรหัสระหว่าง# --
ด้วยรุ่นการตรวจแก้จุดบกพร่องและคุณสามารถดูวิธีการทำงานในชุด Uncomment 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