关于rubys的错误IO#(读/写)_nonblock调用

时间:2016-12-13 11:27:22

标签: ruby sockets

我目前正在为The Odin Project做Ruby on the Web项目。目标是实现一个非常基本的Web服务器,用于解析和响应GETPOST个请求。

我的解决方案使用IO#getsIO#read(maxlen)以及Content-Length Header属性来进行解析。

其他解决方案使用IO#read_nonblock。我用Google搜索了它,但是对它的文档很困惑。它经常与Kernel#select一起提及,这对它们也没有任何帮助。

有人可以向我解释一下非块调用与正常调用的不同之处,它们如何避免阻塞执行线程,以及它们如何与Kernel#select方法一起使用?

2 个答案:

答案 0 :(得分:1)

在阻塞写入中,等待字节写入文件,另一方面,非阻塞写入立即退出。这意味着,您可以继续执行程序,而操作系统则异步将数据写入文件。然后,当您想再次写入时,使用select来查看文件是否已准备好接受下一次写入。

答案 1 :(得分:1)

  

向我解释非阻塞调用与正常调用有何不同

行为上的关键区别在于,在通话时没有可用数据读取,而在EOF时则没有:

  

他们如何避免阻塞执行线程

根据文档,在为基础文件描述符设置O_NONBLOCK后,#read_nonblock正在使用read(2)系统调用。

  

它们如何与Kernel#select方法一起使用?

还有IO.select。在这种情况下,我们可以使用它来等待输入数据的可用性,以便后续的read_nonblock()不会引起错误。如果存在多个输入流,则不知道从哪个流数据下一步到达,必须为之调用read()。这特别有用。