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 parallelistekleri 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ı?
myjobdaha 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 1içinde parallelargs? İş 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ü).
splitkomut nereden geliyor? Ad, standart metin işleme yardımcı programıyla çakışıyor .