我当前正在为ODIN项目的Web项目进行Ruby。目的是实现一个非常基本的网络服务器,该网络服务器解析并响应GET
或POST
请求。
我的解决方案将IO#gets
和IO#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()
。
在封锁写作中,您等到字节写入文件,另一方面,立即进行非阻止写入。这意味着,您可以继续执行程序,而操作系统不同步将数据写入文件。然后,当您想再次写入时,您使用选择来查看文件是否准备好接受下一个写作。