Anggap Anda memiliki saluran pipa seperti berikut:
$ a | b
Jika b
berhenti memproses stdin, setelah beberapa saat pipa terisi, dan menulis, dari a
ke stdout, akan memblokir (sampai b
mulai memproses lagi atau mati).
Jika saya ingin menghindari ini, saya bisa tergoda untuk menggunakan pipa yang lebih besar (atau, lebih sederhana, buffer(1)
) seperti:
$ a | buffer | b
Ini hanya akan memberi saya lebih banyak waktu, tetapi pada akhirnya a
akan berhenti.
Apa yang ingin saya miliki (untuk skenario yang sangat spesifik yang saya bahas) adalah memiliki pipa "bocor" yang, ketika penuh, akan menjatuhkan beberapa data (idealnya, baris demi baris) dari buffer untuk a
melanjutkan pemrosesan (seperti yang dapat Anda bayangkan, data yang mengalir di pipa dapat dibuang, yaitu memiliki data yang diproses b
kurang penting daripada harus a
dapat berjalan tanpa memblokir).
Singkatnya, saya ingin memiliki sesuatu seperti buffer yang dibatasi dan bocor:
$ a | leakybuffer | b
Saya mungkin bisa mengimplementasikannya dengan mudah dalam bahasa apa pun, saya hanya ingin tahu apakah ada sesuatu yang "siap digunakan" (atau sesuatu seperti bash one-liner) yang saya lewatkan.
Catatan: dalam contoh saya menggunakan pipa biasa, tetapi pertanyaannya sama berlaku untuk pipa bernama
Sementara saya memberikan jawaban di bawah ini, saya juga memutuskan untuk menerapkan perintah leakybuffer karena solusi sederhana di bawah ini memiliki beberapa keterbatasan: https://github.com/CAFxX/leakybuffer