Linux фильтр в Ruby, который поддерживает непрерывный поток данных в течение определенного времени с помощью своего внутреннего буфера? - PullRequest
0 голосов
/ 22 февраля 2019

Например, когда входящий поток данных на 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>

Конечно, мы можем предположить,что общее количество байтов входящего потока данных превышает указанный выше размер внутреннего буфера.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...