Tüm çekirdeği bash veya zsh betiğinde kullanmanın etkili yolu


6

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ı?


ipucu: trapSIGCHLD'i monitör modunda yakalamak için kullanın .
Keith

Yanıtlar:



0

Kaç işlemi başlattığınızı unutmayın. Bir işlem sona erdiğinde sayımı azaltın. Sayım maksimumdan düşük olduğunda, yeni bir işlem başlatın.

Tek sorun, bir sürecin sonunun nasıl sinyal verileceğidir. Örneğin, / tmp ($$ ve $ BASHPID'den oluşan) içinde verilen bir adın emty dosyasını oluşturabilirsiniz.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.