C'è un intero elenco di programmi che possono eseguire lavori in parallelo da una shell, che include anche confronti tra loro, nella documentazione per GNU parallel. Ci sono molte, molte soluzioni là fuori. Un'altra buona notizia è che probabilmente sono abbastanza efficienti nella pianificazione dei lavori in modo che tutti i core/processori siano sempre occupati.
Per far funzionare le cose in parallelo, usa "&" alla fine di un comando di shell per eseguirlo in background, quindi wait
per impostazione predefinita (cioè senza argomenti) attenderà fino al termine di tutti i processi in background. Quindi, forse inizia 10 in parallelo, poi aspetta, poi fai altri dieci. Puoi farlo facilmente con due cicli nidificati.
Un altro modo molto utile per farlo è con gnu parallel, che vale la pena installare se non lo si possiede già; questo è prezioso se le attività non richiedono necessariamente la stessa quantità di tempo.
seq 1000 | parallel -j 8 --workdir $PWD ./myrun {}
avvierà ./myrun 1
, ./myrun 2
, ecc., assicurandosi che siano in esecuzione 8 processi alla volta. Può anche richiedere elenchi di nodi se si desidera eseguire su più nodi contemporaneamente, ad esempio in un lavoro PBS; le nostre istruzioni per i nostri utenti su come farlo sul nostro sistema sono qui.
Aggiornato per aggiungere: Vuoi assicurarti di utilizzare gnu-parallel, non l'utilità più limitata con lo stesso nome inclusa nel pacchetto moreutils (la storia divergente dei due è descritta qui.)
Dai un'occhiata alle subshell bash, queste possono essere usate per eseguire parti di uno script in parallelo.
Non l'ho testato, ma potrebbe essere un inizio:
#!/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