2010-03-11 17 views
60

Kabuk betiğimde çoklu iş parçacığı özelliğini tanıtmak istiyorum.Bash'de Çoklu Yayınlama

read_cfg() işlevini farklı değişkenlerle çağıran bir komut dosyası var. Bu işlev çağrılarının her biri bağımsızdır.

Bu işlev çağrılarını (komut dosyaları değil) paralel hale getirmek mümkün olabilir mi? Lütfen bunu nasıl başarabilirim?

+0

Bu çoklu kullanım değil sadece bir parametre alır - bu çoklu işlem bu. Her örnek, orijinalinden 'fork() 'ile kopyalanan ayrı bir işlemde çalıştırılır. Bu işlemler - iş parçacıklarının aksine - kendi dosya tanımlayıcı tablolarına sahiptir ve bellekleri yazma üzerine yazılır (böylece bir değişkenin değerini değiştirdiklerinde, üst işlem bunu görmez). –

cevap

127

Tabii, sadece komutundan sonra & ekleyin:

read_cfg cfgA & 
read_cfg cfgB & 
read_cfg cfgC & 
wait 

tüm bu işler daha sonra aynı anda arka planda çalışır. İsteğe bağlı wait komutu, tüm işlerin bitmesini bekleyecektir.

Her komut ayrı bir işlemde çalışır, bu yüzden teknik olarak "çoklu iş parçacığı" olmaz, ancak sorununuzu çözdüğüne inanıyorum.

+6

İşlem ve iş parçacığı arasındaki farkı okumalısınız. Önerdiğiniz şey çoklu okuma değil - her komut için ayrı süreçleri içerir. – TomTom

+24

@TomTom: İşlemler ve iş parçacıkları arasındaki farkı kesinlikle biliyorum. Eğer OP'nin söz seçimini görüyorsanız, basitçe komutları paralel olarak çalıştırmanın mümkün olup olmadığını sorarım (mümkün). Netleştirmek için bunun hakkında bir not ekledim. – Martin

19

Bash iş denetimi, birden çok iş parçacığı değil, birden çok işlemi içerir.

& son eki ile arka planda bir komut çalıştırabilirsiniz.

Arka plan komutunun tamamlanması için wait komutu ile bekleyebilirsiniz.

Birden çok komutu paralel olarak | ile ayırarak çalıştırabilirsiniz. Bu da bir senkronizasyon mekanizması sağlar, çünkü |'un solundaki bir komutun stdout'u sağdaki komutun stdinine bağlanır.

23

Komut dosyanızın birkaç kopyasını paralel olarak, her kopya farklı giriş verileri için çalıştırabilirsiniz. 4 çekirdek üzerindeki tüm * .cfg dosyaları işlemek için:

ls *.cfg | xargs -P 4 -n 1 read_cfg.sh 

read_cfg.sh komut dosyası (-n yürütür gibi)

+2

sadece 'read_cfg.sh' ya da 'xargs' dosyasının tam yolunu belirtmeniz gereken bir not, dosyayı bulamadığını söyleyecektir. – Jeshurun

+0

'printf '% s \ 0' * .cfg | Kullanmak daha iyi xargs -0 ... '- bu, dosya isimleriyle, yazdırılamayan karakterler vb. ile çalışır. Ayrıca bakınız./ParsingLs). –

İlgili konular