Stdin dosya listesini işleyen bir görevim var. Programın başlatma süresi büyüktür ve her dosyanın aldığı zaman büyük ölçüde değişir. Bu işlemlerin önemli bir kısmını oluşturmak istiyorum, sonra işi hangisi meşgul değilse ona gönderiyorum. Neredeyse istediğimi yapan birkaç farklı komut satırı aracı var, neredeyse iki çalışma seçeneğine daralttım:
find . -type f | split -n r/24 -u --filter="myjob"
find . -type f | parallel --pipe -u -l 1 myjob
Sorun şu ki split
, saf bir yuvarlak robin yapıyor, bu yüzden süreçlerden biri geride kalıyor ve geride kalıyor ve tüm operasyonun tamamlanmasını geciktiriyor; ise parallel
istekleri N hatları başına bir işlem spawn veya giriş bayt ve başlangıç yükü üzerinde çok fazla zaman harcama kadar rüzgar.
Hangi süreçlerin engellenmemiş stdine sahip olduğu süreçleri ve besleme hatlarını yeniden kullanacak böyle bir şey var mı?
myjob
daha fazla girdi almaya hazır olduğunu bilmektir . Bir programın daha fazla girdiyi işlemeye hazır olduğunu bilmenin bir yolu yoktur, bildiğiniz tek şey bir yerlerde bir tamponun (bir boru tamponu, bir stdio tamponu) daha fazla girdi almaya hazır olmasıdır. Programınızın hazır olduğunda bir tür istek göndermesini ayarlayabilir misiniz (örneğin bir bilgi istemi görüntüleyebilir)?
read
çağrılara tepki veren bir FUSE dosya sistemi işinizi görecektir. Bu oldukça büyük bir programlama çabası.
-l 1
içinde parallel
args? İş başına bir girdi satırı işlemeyi paralel olarak anlatan IIRC (yani, myjob çatal başına bir dosya adı, bu nedenle çok fazla başlangıç yükü).
split
komut nereden geliyor? Ad, standart metin işleme yardımcı programıyla çakışıyor .