我正试图以非阻塞的方式从io中读取一行。
不幸的是readline
阻止了。我想我可以使用read_nonblock
和一个额外的缓冲区来解决这个问题,其中我存储了部分结果,检查缓冲区中是否有多行等等。但对于像这样的简单任务来说似乎有点复杂。有更好的方法吗?
注意:我正在使用事件多路分解(select
),我对此非常满意,我不想创建线程,使用EventMachine等...
答案 0 :(得分:5)
我认为read_nonblock解决方案可能就是这样。简单,不是最有效的猴子补丁版本:
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一样,所以你必须拯救它才能得到一个零,等等。
答案 1 :(得分:3)
通过不丢弃不以换行符结尾的数据读取,此实现改进了Mark Reed的答案:
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