当我尝试使用方法时,我收到以下错误" read_nonblock"来自" socket"文库
IO::EAGAINWaitReadable: Resource temporarily unavailable - read would block
但是当我通过终端上的IRB尝试它时,它可以正常工作
如何让它读取缓冲区?
答案 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