Vamos supor que você tenha um pipeline como o seguinte:
$ a | b
Se b
parar de processar stdin, depois de um tempo, o tubo será preenchido e gravado, a
até o stdout, será bloqueado (até que o b
processo comece novamente ou a matriz morra).
Se eu quisesse evitar isso, ficaria tentado a usar um tubo maior (ou, mais simplesmente buffer(1)
) assim:
$ a | buffer | b
Isso simplesmente me daria mais tempo, mas no final a
acabaria.
O que eu gostaria de ter (para um cenário muito específico que estou abordando) é ter um canal "vazado" que, quando cheio, soltaria alguns dados (idealmente, linha por linha) do buffer para permitir a
continuar processamento (como você provavelmente pode imaginar, os dados que fluem no canal são dispensáveis, ou seja, ter os dados processados por b
é menos importante do que a
poder executar sem bloquear).
Para resumir, eu adoraria ter algo como um buffer limitado e com vazamento:
$ a | leakybuffer | b
Provavelmente eu poderia implementá-lo facilmente em qualquer idioma, estava me perguntando se há algo "pronto para usar" (ou algo como uma única linha de base) que estou perdendo.
Nota: nos exemplos, estou usando pipes regulares, mas a pergunta se aplica igualmente aos pipes nomeados
Embora tenha concedido a resposta abaixo, também decidi implementar o comando leakybuffer porque a solução simples abaixo tinha algumas limitações: https://github.com/CAFxX/leakybuffer