Ich bin verwirrt über den Unterschied oder Vorteil (falls vorhanden), eine Reihe von Aufgaben in einer .sh
auszuführen Skript mit GNU parallel
Z.B. Antwort von Ole Tange:
parallel ./pngout -s0 {} R{} ::: *.png
anstatt sie in einer Schleife zu durchlaufen und sie in den Hintergrund zu stellen &
.
Z.B. Antwort von frostschutz:
#copied from the link for illustration
for stuff in things
do
( something
with
stuff ) &
done
wait # for all the something with stuff
Kurz gesagt, sind sie nur syntaktisch oder praktisch unterschiedlich? Und wenn praktisch unterschiedlich, wann sollte ich sie verwenden?
Akzeptierte Antwort:
Mehrere Jobs in den Hintergrund zu stellen, ist eine gute Möglichkeit, die mehreren Kerne einer einzelnen Maschine zu nutzen. parallel
ermöglicht es Ihnen jedoch, Jobs auf mehrere Server Ihres Netzwerks zu verteilen. Von man parallel
:
GNU parallel ist ein Shell-Tool zum parallelen Ausführen von Jobs unter Verwendung
eines oder mehrerer Computer . Die typische Eingabe ist eine Liste von
Dateien, eine Liste von Hosts , eine Liste von Benutzern, eine Liste von URLs oder eine Liste von Tabellen.
Auch bei Ausführung auf einem einzelnen Computer parallel
gibt Ihnen eine viel größere Kontrolle darüber, wie Ihre Jobs parallelisiert werden. Nehmen Sie dieses Beispiel von man
Seite:
To convert *.wav to *.mp3 using LAME running one process per CPU core
run:
parallel lame {} -o {.}.mp3 ::: *.wav
OK, Sie könnten dasselbe mit
machen for i in *wav; do lame "$i" -o "${i%.wav}.mp3" & done
Das ist jedoch länger und umständlicher und, was noch wichtiger ist, es werden so viele Jobs gestartet, wie es .wav
gibt Dateien. Wenn Sie dies auf ein paar tausend Dateien ausführen, wird es wahrscheinlich einen normalen Laptop in die Knie zwingen. parallel
auf der anderen Seite startet einen Job pro CPU-Kern und hält alles sauber und ordentlich.
Grundsätzlich parallel
bietet Ihnen die Möglichkeit, genau einzustellen, wie Ihre Jobs ausgeführt werden und wie viele verfügbare Ressourcen sie verwenden sollen. Wenn Sie wirklich die Leistungsfähigkeit dieses Tools sehen möchten, gehen Sie sein Handbuch durch oder zumindest die Beispiele, die es bietet.
Einfaches Backgrounding hat wirklich bei weitem nicht den Grad an Raffinesse, der mit Parallel verglichen werden könnte. Wie für parallel
unterscheidet sich von xargs
, die GNU-Crowd gibt hier eine schöne Aufschlüsselung. Einige der hervorstechenderen Punkte sind:
- xargs geht schlecht mit Sonderzeichen (wie Leerzeichen, ‘ und “) um.
- xargs kann eine bestimmte Anzahl von Jobs parallel ausführen, unterstützt jedoch nicht die parallele Ausführung von Jobs mit der Anzahl von CPU-Kernen.
- xargs bietet keine Unterstützung für das Gruppieren der Ausgabe, daher kann die Ausgabe zusammenlaufen, z. die erste Hälfte einer Zeile stammt von einem Prozess und die letzte Hälfte der Zeile von einem anderen Prozess.
- xargs hat keine Unterstützung für die Beibehaltung der Reihenfolge der Ausgabe, daher kann die Ausgabe des zweiten Jobs nicht verschoben werden, bis der erste Job fertig ist, wenn Jobs parallel mit xargs ausgeführt werden.
- xargs bietet keine Unterstützung für die Ausführung von Jobs auf Remote-Computern.
- xargs unterstützt keine Kontextersetzung, daher müssen Sie die Argumente erstellen.