Bir dizinde bir sürü PNG resmi var. Bu görüntüleri sıkıştırmak için kullandığım pngout adlı bir uygulamam var. Bu uygulama yaptığım bir komut dosyası tarafından denir. Sorun şu ki, bu komut dosyası bir seferde bir tane yapıyor, şunun gibi:
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
Bir seferde sadece bir dosyayı işlemek çok zaman alır. Bu uygulamayı çalıştırdıktan sonra, CPU'nun sadece% 10 olduğunu görüyorum. Bu yüzden bu dosyaları 4 gruba ayırabilirim, her bir dizini bir dizine koyup 4'ü dört terminal penceresinden, dört işlemden geçirebildiğimi keşfettim. iş zamanın 1 / 4'ünü alır.
İkinci sorun, görüntüleri ve grupları bölüp senaryoyu dört dizine kopyalamak, 4 terminal penceresi açmak, bla bla ...
Hiçbir şeyi bölmek zorunda kalmadan tek bir senaryo ile bunu nasıl yaparsınız?
İki şeyi kastediyorum: ilk önce bir bash betiğinden nasıl bir süreci arka plana çekebilirim? (yalnızca sonuna & sonuna ekleyin?) İkincisi: Dördüncü görevleri gönderdikten sonra arka plana görev göndermeyi nasıl durdurabilirim ve komut dosyasını görevler bitinceye kadar beklemeye nasıl koyabilirim? Demek istediğim, arka plana bir görev sona erdiğinde yeni bir görev göndermek, her zaman 4 görevi paralel tutmak mı demek istiyorsunuz? Bunu yapmazsam, döngü zilyonlarca görevi arka plana fırlatacak ve CPU tıkayacaktır.