ruby 非阻塞行读取

标签 ruby io nonblocking

我正在尝试以非阻塞方式从 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/

相关文章:

JAVA 在查找后使用 RandomAccessFile 非常慢。是什么原因?

ruby-on-rails - 当局部变量处于局部变量时,您将如何远程附加新对象?

python - 通过子类化 `io.TextIOWrapper` 来子类化文件——但是它的构造函数有什么签名?

javascript - rails : Delete nested attribute while updating entry

haskell - MaybeT/也许和 IO : Failsafe reading of information

python - 可以将 SQLAlchemy 配置为非阻塞吗?

node.js - libuv 在内部使用阻塞文件系统调用——为什么?如何?

java - 为什么 Netty 客户端连接 future.operationComplete 在调用者线程中被调用?

python - 如何以编程方式检查 Windows 计算机上打开的浏览器实例?

mysql - 多个 Rails 应用程序读取另一个 Rails 应用程序的单个数据库/表