Zvažte následující scénář. Mám dva programy A a B. Program A výstupy na stdout řádky řetězců, zatímco program B zpracovává řádky ze stdin. Způsob použití těchto dvou programů je samozřejmě:
[e-mail chráněný]:~$ A | B
Teď jsem si všiml, že to pohltí pouze jedno jádro; proto se ptám:
Sdílejí programy A a B stejné výpočetní zdroje? Pokud ano, existuje způsob, jak spustit A a B současně?
Další věc, které jsem si všiml, je, že A běží mnohem rychleji než B, a proto by mě zajímalo, jestli by se dalo nějak spouštět více programů B a nechat je zpracovávat linky, které A vypisuje paralelně.
To znamená, že A by vydal své řádky a bylo by N instancí programů B, které by tyto řádky přečetly (kdokoli je přečetl jako první), zpracovaly je a vydaly na stdout.
Takže moje poslední otázka zní:
Existuje způsob, jak vést výstup do A mezi několika procesy B, aniž byste se museli starat o podmínky závodu a další nesrovnalosti, které by mohly potenciálně nastat?
Přijatá odpověď:
Problém s split --filter
je, že výstup lze zamíchat, takže dostanete půl řádku z procesu 1 následovanou půlkou řádku z procesu 2.
GNU Parallel zaručuje, že nedojde k záměně.
Předpokládejme tedy, že chcete udělat:
A | B | C
Ale to B je strašně pomalé, a tak to chcete paralelizovat. Pak můžete:
A | parallel --pipe B | C
GNU Parallel se standardně rozděluje na \n a velikost bloku 1 MB. To lze upravit pomocí –recend a –block.
Více o GNU Parallel najdete na:http://www.gnu.org/s/parallel/
GNU Parallel můžete nainstalovat za pouhých 10 sekund pomocí:
$ (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
Podívejte se na úvodní video na http://www.youtube.com/playlist?list=PL284C9FF2488BC6D1