关于Rubys IO#(读/写)_nonblock调用的混乱



我当前正在为ODIN项目的Web项目进行Ruby。目的是实现一个非常基本的网络服务器,该网络服务器解析并响应GETPOST请求。

我的解决方案将IO#getsIO#read(maxlen)与内容长度的标头属性一起进行解析。

其他解决方案使用IO#read_nonblock。我搜索了它,但对此文档感到非常困惑。它经常与Kernel#select一起提到,这也没有真正帮助。

有人可以向我解释非块调用与普通呼叫的行为不同,如何避免阻止执行线以及如何与Kernel#select方法一起播放?

向我解释非块调用与普通呼叫的行为不同

行为的关键差异是在呼叫时没有可读取的数据时,而不是在EOF:

  • read_nonblock()提出了一种例外的IO :: Waitable
  • 正常read(length)等到长度 bytes读取(或eof)

他们如何避免阻塞执行线

根据文档,#Read_NonBlock是使用read(2)系统调用O_NONONBLOCK设置为基础文件描述符。

他们如何与内核#选择方法一起玩?

也有IO.select。在这种情况下,我们可以使用它来等待输入数据的可用性,因此随后的read_nonblock()不会导致错误。如果有多个输入流,这一点尤其有用,其中尚不清楚从哪个流数据到达以及必须调用哪个read()

在封锁写作中,您等到字节写入文件,另一方面,立即进行非阻止写入。这意味着,您可以继续执行程序,而操作系统不同步将数据写入文件。然后,当您想再次写入时,您使用选择来查看文件是否准备好接受下一个写作。

最新更新