Jsem zmatený rozdílem nebo výhodou (pokud existuje) spouštění sady úloh v .sh
skript pomocí GNU parallel
Např. Odpověď Ole Tange:
parallel ./pngout -s0 {} R{} ::: *.png
spíše než říkat, že je cyklicky dáte na pozadí &
.
Např. mrazuvzdorná odpověď:
#copied from the link for illustration
for stuff in things
do
( something
with
stuff ) &
done
wait # for all the something with stuff
Jsou zkrátka jen syntakticky nebo prakticky odlišné? A pokud se prakticky liší, kdy bych měl každý použít?
Přijatá odpověď:
Umístění více úloh na pozadí je dobrý způsob, jak využít více jader jednoho stroje. parallel
umožňuje však rozložit úlohy na více serverů vaší sítě. Z man parallel
:
GNU parallel je shellový nástroj pro paralelní provádění úloh pomocí
jednoho nebo více počítačů . Typickým vstupem je seznam
souborů, seznam hostitelů , seznam uživatelů, seznam adres URL nebo seznam tabulek.
I když běží na jednom počítači, parallel
vám dává mnohem větší kontrolu nad tím, jak jsou vaše úlohy paralelizovány. Vezměte si tento příklad z man
stránka:
To convert *.wav to *.mp3 using LAME running one process per CPU core
run:
parallel lame {} -o {.}.mp3 ::: *.wav
OK, můžete udělat totéž s
for i in *wav; do lame "$i" -o "${i%.wav}.mp3" & done
To je však delší a těžkopádnější a co je důležitější, spustí tolik úloh, kolik je .wav
soubory. Pokud to spustíte na několika tisících souborů, pravděpodobně to srazí normální notebook na kolena. parallel
na druhou stranu spustí jednu úlohu na jádro CPU a udrží vše pěkné a uklizené.
V podstatě parallel
vám nabízí možnost doladit, jak jsou vaše úlohy prováděny a kolik dostupných zdrojů by měly využívat. Pokud opravdu chcete vidět sílu tohoto nástroje, projděte si jeho manuál nebo alespoň příklady, které nabízí.
Jednoduché pozadí opravdu nemá úroveň sofistikovanosti, kterou by se dalo srovnávat s paralelou. Pokud jde o to, jak parallel
se liší od xargs
, GNU dav zde dává pěkný rozbor. Některé z nejvýraznějších bodů jsou:
- xargs špatně pracuje se speciálními znaky (jako je mezera, ‘ a “).
- xargs může spouštět daný počet úloh paralelně, ale nemá žádnou podporu pro paralelní spouštění úloh s počtem jader procesoru.
- xargs nemá podporu pro seskupování výstupu, takže výstup může běžet společně, např. první polovina řádku je z jednoho procesu a poslední polovina řádku je z jiného procesu.
- xargs nemá podporu pro zachování pořadí výstupu, takže pokud paralelně běží úlohy pomocí xargs, výstup druhé úlohy nemůže být odložen, dokud nebude dokončena první úloha.
- xargs nepodporuje spouštění úloh na vzdálených počítačích.
- xargs nemá podporu pro nahrazení kontextu, takže budete muset vytvořit argumenty.