Ich möchte die for
Schleifen des folgenden Codes parallelisieren . Wie macht man das?
#!/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
quelle
quelle
Antworten:
Verwenden Sie immer Arbeiter, wenn Sie eine parametrisierte Anzahl von Prozessen erzeugen, und begrenzen Sie die maximale Anzahl von Arbeitern, die erzeugen können .
xargs -n | while read
ist ein einfaches Mittel zum Iterieren von Listen in Stapeln.seq
Erstellt eine Liste mit Zahlen von 1 bis N.xargs -n
unterteilt diese Liste in N / Arbeiter + 1 Chargen.while read i
liest jede Zahlenzeile.work ${i} &
Ruft einfach diework
Funktion mit einem${i}
Stapel von Zahlen auf.Zum Debuggen habe ich auskommentierten Debug-Code hinzugefügt. Ersetzen Sie einfach
echo
die Debug-Version und den Code dazwischen# --
durch die Debug-Version, und Sie können sehen, wie es bei Batches funktioniert. Kommentarset -x
für eine detailliertere Debug-Ausgabe, die Sie möglicherweise in eine Datei umleiten möchten.Führen Sie einfach die Debug-Version mit verschiedenen Parametern aus, um zu sehen, wie sie funktioniert:
Haftungsausschluss: Dieser Code synchronisiert den
min
Wert zwischen Arbeitsprozessen nicht. Das Erreichen des Mindestwerts ist keine schreckliche Übung. Dies wird wahrscheinlich tun:Oder fügen Sie dem Skript selbst dasselbe hinzu:
quelle
Verwenden von GNU Parallel:
Dies läuft
/path/to/a.out
auf jeder CPU. Die Ausgabe lautet wie folgt:Das Perl-Skript betrachtet die erste Spalte und findet das Minimum in der dritten Spalte, die dieselbe erste Spalte enthält.
Sie können GNU Parallel einfach installieren, indem Sie:
Sehen Sie sich die Intro-Videos an, um mehr zu erfahren: https://www.youtube.com/playlist?list=PL284C9FF2488BC6D1
quelle