是否有一个简单的方法来检查Ruby IO实例是否会阻塞read()?

Dhs*_*kdh 14 ruby io asynchronous nonblocking

我正在寻找Ruby中的一个方法,基本上是这样的:

io.ready_for_read?
Run Code Online (Sandbox Code Playgroud)

我只想检查一个给定的IO对象(在我的情况下,是一个popen调用的结果)是否有可用的输出,即后续调用io.read(1)不会阻塞.

这是我看到的两个选项,我都不喜欢:

  1. io.read_nonblock- 太简单的Unix抽象read()- 我不想处理errno错误处理.

  2. io.select 超时0 - 模糊了这个简单操作的目的.

是否有一个我忽略的更好的选择?

Ian*_*les 9

有点晚了,但如果你require 'io/wait',你可以ready?用来验证IO是否可以不受阻塞地被读取.当然,取决于您打算阅读的程度(以及您打算如何做),您的IO对象可能仍会阻止,但这应该有所帮助.我不确定这个库是否在所有平台上都受支持,而且我也不知道为什么这个功能与IO库的其余部分分离.在此处查看更多信息:http://ruby-doc.org/stdlib/libdoc/io/wait/rdoc/


Dhs*_*kdh 6

我准备得出结论,不,没有简单的方法来做到这一点.根据Peter Cooper的建议,这里是IO#ready_for_read?:

class IO
  def ready_for_read?
    result = IO.select([self], nil, nil, 0)
    result && (result.first.first == self)
  end
end
Run Code Online (Sandbox Code Playgroud)