ฉันมีงานที่ประมวลผลรายการไฟล์ใน stdin เวลาเริ่มต้นของโปรแกรมมีความสำคัญและระยะเวลาที่แต่ละไฟล์ใช้กันอย่างกว้างขวาง ฉันต้องการที่จะวางไข่เป็นจำนวนมากในกระบวนการเหล่านี้จากนั้นส่งงานไปยังที่ใดก็ตามที่ไม่ยุ่ง มีเครื่องมือ commandline ที่แตกต่างกันหลายอย่างที่เกือบจะทำในสิ่งที่ฉันต้องการฉัน จำกัด ให้เหลือสองตัวเลือกที่ใช้งานได้
find . -type f | split -n r/24 -u --filter="myjob"
find . -type f | parallel --pipe -u -l 1 myjob
ปัญหาก็คือsplit
การปัดเศษบริสุทธิ์ดังนั้นหนึ่งในกระบวนการที่ได้รับข้างหลังและอยู่ข้างหลังล่าช้าการดำเนินการทั้งหมดเสร็จสมบูรณ์; ในขณะที่parallel
ต้องการวางไข่หนึ่งกระบวนการต่อ N บรรทัดหรือไบต์ของอินพุตและฉันปิดท้ายการใช้จ่ายเวลามากเกินไปในการเริ่มต้นค่าใช้จ่าย
มีบางอย่างเช่นนี้ที่จะใช้กระบวนการและฟีดบรรทัดไปยังกระบวนการใดก็ตามที่มี stdins ที่ไม่ถูกบล็อก
myjob
พร้อมที่จะรับข้อมูลเพิ่มเติม ไม่มีวิธีที่จะรู้ว่าโปรแกรมพร้อมที่จะประมวลผลอินพุตมากขึ้นสิ่งที่คุณสามารถรู้ได้คือบัฟเฟอร์บางแห่ง (บัฟเฟอร์ไพพ์, บัฟเฟอร์ stdio) พร้อมที่จะรับอินพุตเพิ่มขึ้น คุณสามารถจัดโปรแกรมให้ส่งคำขอบางประเภท (เช่นแสดงพรอมต์) เมื่อพร้อมหรือไม่
read
โทรจะทำเคล็ดลับ นั่นเป็นความพยายามเขียนโปรแกรมที่ค่อนข้างใหญ่
-l 1
ในparallel
args? IIRC ที่บอกขนานกับการประมวลผลอินพุตหนึ่งบรรทัดต่องาน (เช่นหนึ่งชื่อไฟล์ต่อทางแยกของ myjob ดังนั้นค่าใช้จ่ายในการเริ่มต้นจำนวนมาก)
split
คำสั่งนั้นมาจากไหน? ชื่อขัดแย้งกับยูทิลิตี้การประมวลผลข้อความมาตรฐาน