Yalnızca bir çekirdeği kullanabilen "do_something" komutuyla çok sayıda dosyayı işlemek istersem, her bir dosyanın bağımsız olarak işlenebileceğini varsayarak tüm kullanılabilir çekirdekleri kullanmanın en iyi yolu nedir?
Şu anda şöyle bir şey yapıyorum:
#!/bin/zsh
TASK_LIMIT=8
TASKS=0
for i in *(.)
{
do_something "$i"&
TASKS=$(($TASKS+1))
if [[ $TASKS -ge $TASK_LIMIT ]]; then
wait; TASKS=0; fi
}
wait
Açıkçası, bu verimli değil çünkü $ TASK_LIMIT $ 'a ulaştıktan sonra tüm "do_something" işlemleri bittiğinde bekler. Örneğin, gerçek senaryomda,>% 700 yerine 8 çekirdekli işlemcimin yaklaşık% 500'ünü kullanıyorum.
$ TASK_LIMIT olmadan çalışmak bir seçenek değildir çünkü "do_something" çok fazla hafıza tüketebilir.
İdeal olarak, komut dosyası paralel görev sayısını $ TASK_LIMIT değerinde tutmaya çalışmalıdır: örneğin 8 görev 1 bittiğinde ve işlenecek en az bir dosya varsa, komut dosyası kalan 7 görev beklemek yerine "do_something" komutunu çalıştırmalıdır. bitirmek için. Bunu zsh veya bash olarak gerçekleştirmenin bir yolu var mı?
trap
SIGCHLD'i monitör modunda yakalamak için kullanın .