Saya ingin memparalelkan for
loop dari kode berikut. Bagaimana cara melakukannya?
#!/bin/bash
N=$1
n=$2
for (( i=1; i<=$N; i++ )); do
min=100000000000000 //set min to some garbage value
for (( j=1; j<=$n; j++ )); do
val=$(/path/to/a.out)
val2=`echo $val | bc`
if (( $val2 < $min )); then
min=$val2;
fi
done
arr=("${arr[@]}" "$min")
done
bash
shell-script
parallelism
RIchard Williams
sumber
sumber
Jawaban:
Selalu gunakan pekerja saat menelurkan jumlah proses berparameter dan batasi jumlah maksimum pekerja yang bisa muncul .
xargs -n | while read
adalah cara sederhana daftar iterasi dalam batch.seq
membuat daftar angka dari 1 hingga N.xargs -n
memecah daftar itu menjadi N / pekerja + 1 batch.while read i
membaca setiap baris angka.work ${i} &
hanya memanggilwork
fungsi dengan${i}
sejumlah angka.Untuk debug saya telah menambahkan kode debug komentar. Cukup ganti
echo
dengan versi debug dan kode antara# --
dengan versi debug-nya dan Anda dapat melihat cara kerjanya pada batch. Batalkan komentarset -x
untuk hasil debug yang lebih terperinci yang mungkin ingin Anda redirect ke file.Jalankan saja versi debug dengan parameter berbeda untuk melihat bagaimana operasinya:
Penafian: Kode ini tidak menyinkronkan
min
nilai antara proses pekerja. Mendapatkan nilai minimum bukanlah latihan yang mengerikan. Ini mungkin akan dilakukan:Atau cukup tambahkan yang sama ke skrip itu sendiri:
sumber
Menggunakan GNU Parallel:
Ini akan berjalan
/path/to/a.out
pada masing-masing cpu. Outputnya akan seperti:Script perl melihat kolom pertama dan menemukan minimum di kolom ke-3 yang memiliki kolom pertama yang sama.
Anda dapat menginstal GNU Parallel hanya dengan:
Tonton video intro untuk mempelajari lebih lanjut: https://www.youtube.com/playlist?list=PL284C9FF2488BC6D1
sumber