Benim cevabım biraz geç, ama mevcut tüm cevapları sadece biraz düşmek inanıyoruz kısa. Bu gibi şeyler yapma biçimim, alt işlemlerde belirli sayıda komut çalıştırabilen xargs
ile ilgilidir. Ben kullanacağı
tek satırlık basit geçerli:
$ seq 1 10 | xargs -n1 -P2 bash -c 'i=$0; url="http://example.com/?page${i}.html"; curl -O -s $url'
Bu, bazı açıklama garanti. -n 1
kullanımı, bir kerede tek bir giriş bağımsız değişkenini işlemek için xargs
bildirir. Bu örnekte, 1 ... 10
numaralarının her biri ayrı ayrı işlenir. Ve -P 2
, her bir giriş bağımsız değişkeni işleninceye kadar, her biri tek bir bağımsız değişkenle ilgilenen 2 alt işlemin her zaman çalışmasını sağlamak için xargs
bildirir.
Bunu MapReduce olarak kabukta düşünebilirsiniz. Ya da belki sadece Harita aşaması. Ne olursa olsun, makinenizi bombaladığınızdan emin olmadan çok fazla iş yapmanın etkili bir yoludur. Bir kabukta bir döngüde benzer bir şey yapmak mümkündür, ancak bu yönetimin, xargs
'un bu harika kullanımının ne kadar harika olduğunu anladıktan sonra oldukça anlamsız görünmeye başlayan süreç yönetimini gerçekleştirin.
Güncelleme: xargs
numaralı örneğimin geliştirilebileceğinden şüpheleniyorum (en azından Mac OS X ve -J
bayrağındaki BSD). GNU Parallel'in ile komut yanı biraz daha az hantaldır: Sisteminiz pidof
veya pgrep
gibi komutlar varsa sürecinin sınırlı sayıda kolaydır
parallel --jobs 2 curl -O -s http://example.com/?page{}.html ::: {1..10}
İçerik uzunluğunu bulmak için önceden istekte bulun, tekil çoklu yüklemeleri birleştirmek, çok işlemli geçiş yapmak, parçaların sırasını korumak ve sıralı sırada olduğunuz sırada onlara katılmak için '--range' komutunu kullanın. Çoğu geliştiricinin yaptığı şeydir (örneğin: [htcat projesi] (https://github.com/eladkarako/htcat)) –