【发布时间】:2010-10-30 04:20:52
【问题描述】:
我正在寻找一种 Ruby 中的方法,基本上是这样的:
io.ready_for_read?
我只想检查给定的IO 对象(在我的情况下,是popen 调用的结果)是否有可用的输出,即后续调用io.read(1) 是否不会阻塞。
这是我看到的两个选项,我都不喜欢:
io.read_nonblock- Unix 的抽象太薄了read()- 我不想处理errno错误处理。io.selectwith timeout 0 -- 混淆了这个简单操作的目的。
有没有我忽略的更好的选择?
【问题讨论】:
-
我不/认为/这样。这确实是 select 的用途。是的,select 的语法很糟糕,但我想理论上你可以给“ready_for_read”打补丁?在使用 select 的 IO 中键入方法。
-
IO#ready_for_read?的实现对我不起作用——它总是返回 true。我认为问题在于IO#select阻塞,直到流被另一个进程打开写入(在我的情况下它总是已经如此),直到有实际数据要读取。我正在尝试寻找另一种方法来实现这一目标,但我运气不佳。
标签: ruby asynchronous io nonblocking