我目前正在为The Odin Project做Ruby on the Web项目。目标是实现一个非常基本的Web服务器,用于解析和响应GET
或POST
个请求。
我的解决方案使用IO#gets
和IO#read(maxlen)
以及Content-Length Header属性来进行解析。
其他解决方案使用IO#read_nonblock
。我用Google搜索了它,但是对它的文档很困惑。它经常与Kernel#select
一起提及,这对它们也没有任何帮助。
有人可以向我解释一下非块调用与正常调用的不同之处,它们如何避免阻塞执行线程,以及它们如何与Kernel#select
方法一起使用?
答案 0 :(得分:1)
在阻塞写入中,等待字节写入文件,另一方面,非阻塞写入立即退出。这意味着,您可以继续执行程序,而操作系统则异步将数据写入文件。然后,当您想再次写入时,使用select来查看文件是否已准备好接受下一次写入。
答案 1 :(得分:1)
向我解释非阻塞调用与正常调用有何不同
行为上的关键区别在于,在通话时没有可用数据读取,而在EOF时则没有:
read_nonblock()
引发IO :: WaitReadable异常类型read(length)
等待直到读取 length 个字节(或EOF)他们如何避免阻塞执行线程
根据文档,在为基础文件描述符设置O_NONBLOCK后,#read_nonblock正在使用read(2)系统调用。
它们如何与Kernel#select方法一起使用?
还有IO.select
。在这种情况下,我们可以使用它来等待输入数据的可用性,以便后续的read_nonblock()
不会引起错误。如果存在多个输入流,则不知道从哪个流数据下一步到达,必须为之调用read()
。这特别有用。