Ho un sacco di immagini PNG su una directory. Ho un'applicazione chiamata pngout che eseguo per comprimere queste immagini. Questa applicazione è chiamata da uno script che ho fatto. Il problema è che questo script ne esegue uno alla volta, qualcosa del genere:
FILES=(./*.png)
for f in "${FILES[@]}"
do
echo "Processing $f file..."
# take action on each file. $f store current file name
./pngout -s0 $f R${f/.//}
done
L'elaborazione di un solo file alla volta richiede molto tempo. Dopo aver eseguito questa app, vedo che la CPU è solo del 10%. Quindi ho scoperto che posso dividere questi file in 4 batch, mettere ogni batch in una directory e attivarne 4, da quattro finestre di terminale, quattro processi, quindi ho quattro istanze del mio script, allo stesso tempo, che elaborano quelle immagini e il il lavoro richiede 1/4 del tempo.
Il secondo problema è che ho perso tempo a dividere immagini e batch e copiare lo script in quattro directory, aprire 4 finestre di terminale, bla bla...
Come si fa con uno script, senza dover dividere nulla?
Intendo due cose:prima come faccio a partire da uno script bash, attivare un processo in background? (aggiungi solo &alla fine?) Secondo:come faccio a interrompere l'invio di attività in background dopo aver inviato la quarta attività e mettere lo script in attesa fino alla fine delle attività? Voglio dire, basta inviare una nuova attività in background quando una attività finisce, mantenendo sempre 4 attività in parallelo? se non lo faccio, il ciclo attiverà miliardi di attività in background e la CPU si intaserà.
Risposta accettata:
Se hai una copia di xargs
che supporta l'esecuzione parallela con -P
, puoi semplicemente farlo
printf '%s