IO :: EAGAINWaitReadable:资源暂时不可用 - 读取将阻止

时间:2015-06-05 14:56:10

标签: ruby ruby-on-rails-4

当我尝试使用方法时,我收到以下错误" read_nonblock"来自" socket"文库

IO::EAGAINWaitReadable: Resource temporarily unavailable - read would block

但是当我通过终端上的IRB尝试它时,它可以正常工作

如何让它读取缓冲区?

1 个答案:

答案 0 :(得分:2)

  

当我尝试使用“socket”库中的“read_nonblock”方法时出现以下错误

当缓冲区中的数据未准备好时,这是预期的行为。由于异常IO::EAGAINWaitReadable源自ruby版本2.1.0,因此在旧版本中,您必须使用其他端口选择来捕获IO::WaitReadable并重试。正如在ruby documentation中所建议的那样:

begin
   result = io.read_nonblock(maxlen)
rescue IO::WaitReadable
   IO.select([io])
   retry
end

对于较新版本的os ruby​​,您也应该捕获IO::EAGAINWaitReadable,但只需重试读取超时或无限。我没有在文档中找到示例,但请记住它没有端口选择:

begin
   result = io.read_nonblock(maxlen)
rescue IO::EAGAINWaitReadable
   retry
end

然而,我的一些调查导致在IO::EAGAINWaitReadable上进行端口选择也更好,所以你可以得到:

begin
   result = io.read_nonblock(maxlen)
rescue IO::WaitReadable, IO::EAGAINWaitReadable
   IO.select([io])
   retry
end

为了支持两个版本的异常代码,只需在IO::EAGAINWaitReadable子句下的 lib / 核心中声明if的定义:

if ! ::IO.const_defined?(:EAGAINWaitReadable)
   class ::IO::EAGAINWaitReadable; end
end