สมมติว่าคุณมีไพพ์ไลน์ดังนี้:
$ a | b
หากb
หยุดการประมวลผล stdin หลังจากนั้นไม่นานท่อจะเต็มและเขียนจากa
ไปยัง stdout จะบล็อก (จนกว่าจะb
เริ่มการประมวลผลอีกครั้งหรือไม่ก็ตาย)
หากฉันต้องการหลีกเลี่ยงสิ่งนี้ฉันอาจถูกล่อลวงให้ใช้ท่อขนาดใหญ่กว่า (หรือมากกว่านั้นbuffer(1)
) ได้เช่น:
$ a | buffer | b
นี่จะซื้อเวลาให้ฉันมากขึ้น แต่ในที่สุดa
ก็จะหยุด
สิ่งที่ฉันชอบ (สำหรับสถานการณ์ที่เฉพาะเจาะจงมากที่ฉันกำลังพูดถึง) คือการมีท่อ "รั่ว" ที่เมื่อเต็มแล้วจะลดลงข้อมูลบางส่วน (นึกคิดทีละบรรทัดโดยบรรทัด) จากบัฟเฟอร์เพื่อให้a
ดำเนินการต่อ การประมวลผล (อย่างที่คุณคงจินตนาการได้ว่าข้อมูลที่ไหลในไพพ์นั้นมีค่าใช้จ่ายนั่นคือการมีข้อมูลที่ประมวลผลโดยb
มีความสำคัญน้อยกว่าการa
วิ่งโดยไม่ปิดกั้น)
เพื่อสรุปมันขึ้นมาฉันชอบที่จะมีบางสิ่งบางอย่างเช่นบัฟเฟอร์ที่มีขอบเขตและมีรอยรั่ว:
$ a | leakybuffer | b
ฉันอาจใช้มันได้อย่างง่ายดายในภาษาใด ๆ ฉันแค่สงสัยว่ามีบางสิ่งที่ "พร้อมใช้" (หรือบางสิ่งบางอย่างเช่นทุบตีสายการบินเดียว) ที่ฉันขาดไป
หมายเหตุ: ในตัวอย่างที่ฉันใช้ไพพ์ทั่วไป แต่คำถามก็ใช้ได้กับไพพ์ที่ตั้งชื่อด้วย
ในขณะที่ฉันได้รับคำตอบด้านล่างฉันก็ตัดสินใจที่จะใช้คำสั่ง leakybuffer เพราะวิธีง่ายๆด้านล่างมีข้อ จำกัด บางประการ: https://github.com/CAFxX/leakybuffer