Например, когда входящий поток данных на STDIN может иметь паузы, паузы в нем на несколько минут, в то время как данные не отправляются, потому что фактические данные все еще готовятся или в настоящее время по какой-то причине недоступны.
Я хотел бы написать CLI-приложение на Ruby, которое читает собственный STDIN и записывает данные без каких-либо изменений в свой собственный STDOUT.Однако он должен поддерживать внутренний буфер, который предотвращает ситуацию, когда нет входящих данных.В этом случае он должен обратиться к своему внутреннему буферу и предоставить исходящие данные для STDOUT из этого буфера, например, 64-1024 байта в секунду или даже меньше, пока не закончится внутренний буфер.
Я хотел быиспользуйте этот фильтр следующим образом:
producer_app | filter | consumer_app
Без буферизации это просто:
bufsize=64*1024
while data=STDIN.read(bufsize) do
STDOUT.write(data)
end
К сожалению, когда на STDIN нет данных, скажем, минуту, тогдаВызов STDIN.read (bufsize) просто блокирует (дальнейшее выполнение) на минуту, что не очень хорошо в моем случае, потому что consumer_app немедленное закрывается, завершается, когда не может прочитать какие-либо данные в течение 20 секунд (загружает данные всервер, который закрывает соединение, когда нет данных для чтения в течение 20 секунд).
Я думаю, что он должен каким-то образом использовать вызов STDIN.read_nonblock (), например:
data=STDIN.read_nonblock(bufsize) rescue nil
возвращает nil в переменную «data», когда нет данных для чтения, иначе он возвращает некоторые данные, размер которых в байтах <= чем bufsize. </p>
Конечно, мы можем предположить,что общее количество байтов входящего потока данных превышает указанный выше размер внутреннего буфера.