我正在尝试以非阻塞方式从 io 中读取一行。
不幸的是 readline
block 。我想我可以用 read_nonblock
解决这个问题,并在其中存储部分结果的附加缓冲区,检查缓冲区中是否有多行等。但是对于像这样的简单任务来说似乎有点复杂.有更好的方法吗?
注意:我正在使用事件多路分解(select
)并且我对此很满意,我不想创建线程,使用 EventMachine 等...
最佳答案
我认为 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 一样,所以你必须拯救它才能得到 nil 等。
关于ruby 非阻塞行读取,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9803019/