GNU/Linux >> LINUX-Kenntnisse >  >> Linux

Piped-Befehle parallel ausführen?

Betrachten Sie das folgende Szenario. Ich habe zwei Programme A und B. Programm A gibt an stdout-Zeilen von Strings aus, während Programm B Zeilen von stdin verarbeitet. Die Art und Weise, diese beiden Programme zu verwenden, ist natürlich:

[E-Mail-geschützt]:~$ A | B

Jetzt habe ich bemerkt, dass dies nur einen Kern auffrisst; daher frage ich mich:

Teilen sich die Programme A und B die gleichen Rechenressourcen? Wenn ja, gibt es eine Möglichkeit, A und B gleichzeitig auszuführen?

Eine andere Sache, die mir aufgefallen ist, ist, dass A viel viel schneller läuft als B, daher frage ich mich, ob ich irgendwie mehr B-Programme ausführen und sie die Zeilen verarbeiten lassen könnte, die A parallel ausgibt.

Das heißt, A würde seine Zeilen ausgeben, und es gäbe N Instanzen von Programmen B, die diese Zeilen lesen würden (wer auch immer sie zuerst liest), sie verarbeiten und auf stdout ausgeben würde.

Also meine letzte Frage ist:

Gibt es eine Möglichkeit, die Ausgabe zwischen mehreren B-Prozessen an A weiterzuleiten, ohne sich um Rennbedingungen und andere Inkonsistenzen kümmern zu müssen, die möglicherweise auftreten könnten?

Akzeptierte Antwort:

Ein Problem mit split --filter ist, dass die Ausgabe verwechselt werden kann, sodass Sie eine halbe Zeile von Prozess 1 gefolgt von einer halben Zeile von Prozess 2 erhalten.

GNU Parallel garantiert, dass es keine Verwechslungen gibt.

Nehmen Sie also an, Sie möchten Folgendes tun:

 A | B | C

Aber dieses B ist furchtbar langsam, und deshalb möchten Sie das parallelisieren. Dann können Sie Folgendes tun:

A | parallel --pipe B | C

GNU Parallel teilt standardmäßig auf \n und eine Blockgröße von 1 MB auf. Dies kann mit –recend und –block angepasst werden.

Weitere Informationen zu GNU Parallel finden Sie unter:http://www.gnu.org/s/parallel/

Sie können GNU Parallel in nur 10 Sekunden installieren mit:

$ (wget -O - pi.dk/3 || lynx -source pi.dk/3 || curl pi.dk/3/ || \
   fetch -o - http://pi.dk/3 ) > install.sh
$ sha1sum install.sh | grep 67bd7bc7dc20aff99eb8f1266574dadb
12345678 67bd7bc7 dc20aff9 9eb8f126 6574dadb
$ md5sum install.sh | grep b7a15cdbb07fb6e11b0338577bc1780f
b7a15cdb b07fb6e1 1b033857 7bc1780f
$ sha512sum install.sh | grep 186000b62b66969d7506ca4f885e0c80e02a22444
6f25960b d4b90cf6 ba5b76de c1acdf39 f3d24249 72930394 a4164351 93a7668d
21ff9839 6f920be5 186000b6 2b66969d 7506ca4f 885e0c80 e02a2244 40e8a43f
$ bash install.sh

Sehen Sie sich das Einführungsvideo auf http://www.youtube.com/playlist?list=PL284C9FF2488BC6D1

an
Linux
  1. In welcher Reihenfolge werden weitergeleitete Befehle ausgeführt?

  2. Sind Linux-Dienstprogramme beim Ausführen von Pipe-Befehlen intelligent?

  3. Welche Bash wird ausgeführt?

  4. A bis Z Linux-Befehle

  5. Linux-Suchbefehle

5 Linux-Anfängerfehler

Nmap-Befehle mit Beispielen

YUM-Befehle

Führen Sie parallel mehrere Befehle gleichzeitig im selben Terminal aus

Bash-Skript, das eine begrenzte Anzahl von Befehlen parallel verarbeitet

Werden Befehle in einem Bash-Skript parallel oder nacheinander ausgeführt?