GNU parallel vs & (ich meine Hintergrund) vs xargs -P

39

Ich bin verwirrt über den Unterschied oder den Vorteil (falls vorhanden), eine Reihe von Aufgaben in einem .shSkript mit auszuführenGNU parallel

ZB die Antwort von Ole Tange :

parallel ./pngout -s0 {} R{} ::: *.png

anstatt zu sagen, sie zu durchlaufen und sie in den Hintergrund zu stellen &.

ZB Frostschutz ‚s Antwort:

#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 verschieden? Und wenn praktisch anders, wann sollte ich sie verwenden?

Stephen Henderson
quelle

Antworten:

46

Wenn Sie mehrere Jobs in den Hintergrund stellen, können Sie die mehreren Kerne einer einzelnen Maschine gut nutzen. parallelErmöglicht es Ihnen jedoch, Aufträge auf mehrere Server Ihres Netzwerks zu verteilen. Von man parallel:

GNU parallel ist ein Shell-Tool zum parallelen Ausführen von Jobs auf einem oder mehreren Computern . 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.

Selbst wenn Sie auf einem einzelnen Computer ausgeführt werden, haben parallelSie weitaus mehr Kontrolle darüber, wie Ihre Jobs parallelisiert werden. Nehmen Sie dieses Beispiel von der manSeite:

   To convert *.wav to *.mp3 using LAME running one process per CPU core
   run:

   parallel lame {} -o {.}.mp3 ::: *.wav

OK, das könnte man auch mit machen

   for i in *wav; do lame "$i" -o "${i%.wav}.mp3" & done

Dies ist jedoch länger und umständlicher und führt vor allem dazu, dass so viele Jobs gestartet werden, wie .wavDateien vorhanden sind . Wenn Sie dies mit ein paar tausend Dateien ausführen, wird wahrscheinlich ein normaler Laptop in die Knie gezwungen. parallelAuf der anderen Seite wird ein Job pro CPU-Kern gestartet und alles schön aufgeräumt.

Bietet parallelIhnen im Grunde die Möglichkeit, die Ausführung Ihrer Jobs und die Menge der verfügbaren Ressourcen, die sie verwenden sollten, zu optimieren. Wenn Sie die Leistungsfähigkeit dieses Tools wirklich sehen möchten, lesen Sie das Handbuch oder zumindest die darin enthaltenen Beispiele.

Einfache Hintergründe haben wirklich nicht annähernd das Niveau von Raffinesse, das man mit Parallelen vergleichen kann. Was , wie parallelunterscheidet sich von xargs, bevölkern die GNU einen schönen Zusammenbruch geben hier . Einige der wichtigsten Punkte sind:

  • xargs behandelt Sonderzeichen (wie Leerzeichen, 'und ") schlecht.
  • xargs kann eine bestimmte Anzahl von Jobs gleichzeitig ausführen, unterstützt jedoch nicht die parallele Ausführung von Jobs mit einer Anzahl von CPU-Kernen.
  • xargs unterstützt keine Gruppierung der Ausgabe, daher kann die Ausgabe zusammen ausgeführt werden, z. B. stammt die erste Hälfte einer Zeile von einem Prozess und die letzte Hälfte der Zeile von einem anderen Prozess.
  • xargs unterstützt die Beibehaltung der Ausgabereihenfolge nicht. Wenn also Jobs mit xargs parallel ausgeführt werden, kann die Ausgabe des zweiten Jobs erst verschoben werden, wenn der erste Job ausgeführt wurde.
  • xargs unterstützt die Ausführung von Jobs auf Remotecomputern nicht.
  • Da xargs das Ersetzen von Kontexten nicht unterstützt, müssen Sie die Argumente erstellen.
terdon
quelle
1
Das ist eine gute Antwort, danke. Es bestätigt irgendwie, was ich vermutet habe. Ich hasse die parallelSyntax, noch eine neue Marke von Tastatur-Faceroll zu merken. Aber ich denke, das automatische Ausgleichen zwischen Kernen / Jobs lohnt sich ...?
Stephen Henderson
3
Schauen Sie sich an, semwelches Teil des GNU Parallel-Pakets ist. Das könnte Ihren Syntaxanforderungen besser entsprechen.
Ole Tange
1
@OleTange thx, guten Anruf
Stephen Henderson
> xargs unterstützt kein Ersetzen des Kontexts, daher müssen Sie die Argumente erstellen. --- Was bedeutet das? Ist es nicht xargs -I%
raine
4
Das parallelist zwar mächtiger als xargs, aber dieser Vergleich ist eher voreingenommen. Zum Beispiel xargsunterstützt nullterminierten Strings als Eingabe zu vermeiden Probleme mit Leerzeichen und Anführungszeichen, und kann auch -dzu emulieren parallel(auch im Vergleich erwähnt!). xargs -Iist für die meisten einfachen Fälle ein ausreichender Kontextersatz, und ich kenne normalerweise die Anzahl der Kerne auf der Maschine. Ich habe nie ein Problem mit nicht gruppierten Ausgaben festgestellt.
Sam Brightman