V dokumentaci pro paralelní GNU je celý seznam programů, které mohou paralelně spouštět úlohy z shellu, včetně jejich srovnání. Existuje mnoho, mnoho řešení. Další dobrou zprávou je, že jsou pravděpodobně docela efektivní při plánování úloh, takže všechna jádra/procesory jsou neustále zaneprázdněna.
Chcete-li, aby věci běžely paralelně, použijte '&' na konci příkazu shell, který jej spustí na pozadí, a poté wait
bude ve výchozím nastavení (tj. bez argumentů) čekat na dokončení všech procesů na pozadí. Takže možná odstartujte 10 paralelně, pak počkejte a pak udělejte dalších deset. Můžete to udělat snadno pomocí dvou vnořených smyček.
Další velmi praktický způsob, jak toho dosáhnout, je pomocí gnu parallel, které se vyplatí nainstalovat, pokud jej ještě nemáte; to je neocenitelné, pokud úkoly nemusí nutně trvat stejně dlouho.
seq 1000 | parallel -j 8 --workdir $PWD ./myrun {}
spustí ./myrun 1
, ./myrun 2
atd. a ujistěte se, že běží 8 úloh najednou. Může také trvat seznamy uzlů, pokud chcete běžet na několika uzlech najednou, např. v úloze PBS; naše pokyny pro naše uživatele, jak to udělat v našem systému, jsou zde.
Aktualizováno o přidání: Chcete se ujistit, že používáte gnu-parallel, nikoli omezenější nástroj stejného jména, který je součástí balíčku moreutils (rozdílná historie obou je popsána zde.)
Podívejte se na subshell bash, lze je použít k paralelnímu spouštění částí skriptu.
Netestoval jsem to, ale tohle by mohl být začátek:
#!/bin/bash
for i in $(seq 1 1000)
do
( Generating random numbers here , sorting and outputting to file$i.txt ) &
if (( $i % 10 == 0 )); then wait; fi # Limit to 10 concurrent subshells.
done
wait