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