Рубин неблокируемая строка чтения - PullRequest
8 голосов
/ 21 марта 2012

Я пытаюсь прочитать строку из io неблокирующим способом.

К сожалению readline блоков.Я думаю, что могу решить эту проблему с помощью read_nonblock с помощью дополнительного буфера, в котором я храню частичный результат, проверяю, есть ли в буфере несколько строк и т. Д., Но это кажется немного сложным для такой простой задачи, как эта.Есть ли лучший способ сделать это?

Примечание: я использую демультиплексирование событий (select), и я очень доволен этим, я не хочу создавать потоки, использовать EventMachine и т. Д....

Ответы [ 2 ]

5 голосов
/ 28 марта 2012

Я думаю, что решение read_nonblock - это, вероятно, путь.Простая, не максимально эффективная версия monkey-patch:

class IO
  def readline_nonblock
    rlnb_buffer = ""
    while ch = self.read_nonblock(1) 
      rlnb_buffer << ch
      if ch == "\n" then
        result = rlnb_buffer
        return result
      end
    end     
  end
end      

Это выдает исключение, если нет готовых данных, как read_nonblock, так что вам нужно спасти это, чтобы просто вернуть ноль и т. Д.

3 голосов
/ 02 января 2014

Эта реализация улучшает ответ Марка Рида, не отбрасывая прочитанные данные, которые не заканчиваются символом новой строки:

class IO
  def readline_nonblock
    buffer = ""
    buffer << read_nonblock(1) while buffer[-1] != "\n"

    buffer
  rescue IO::WaitReadable => blocking
    raise blocking if buffer.empty?

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