关于rubys IO(读/写)的混淆\u非阻塞调用
我目前正在为奥丁项目做这个项目。目标是实现一个非常基本的Web服务器,它解析并响应GET或POST请求 我的解决方案使用IOgets和IOreadmaxlen以及Content-Length头属性来进行解析 其他解决方案使用IOread_非块。我在谷歌上搜索过它,但对它的文档感到非常困惑。它经常与Kernelselect一起提到,这也没有真正的帮助关于rubys IO(读/写)的混淆\u非阻塞调用,ruby,sockets,Ruby,Sockets,我目前正在为奥丁项目做这个项目。目标是实现一个非常基本的Web服务器,它解析并响应GET或POST请求 我的解决方案使用IOgets和IOreadmaxlen以及Content-Length头属性来进行解析 其他解决方案使用IOread_非块。我在谷歌上搜索过它,但对它的文档感到非常困惑。它经常与Kernelselect一起提到,这也没有真正的帮助 有人能给我解释一下非块调用与普通调用有什么不同,它们如何避免阻塞执行线程,以及它们如何与Kernelselect方法一起使用吗?在阻塞写入中,您等待
有人能给我解释一下非块调用与普通调用有什么不同,它们如何避免阻塞执行线程,以及它们如何与Kernelselect方法一起使用吗?在阻塞写入中,您等待字节写入文件,另一方面,非阻塞写入会立即退出。这意味着,当操作系统将数据异步写入文件时,您可以继续执行程序。然后,当您想再次写入时,使用select查看文件是否准备好接受下一次写入 向我解释非阻塞调用与正常调用的不同之处 行为上的关键区别在于,在调用时没有数据可读取,但在EOF时没有数据可读取: 引发异常类型的IO::WaitReadable 正常等待,直到读取长度字节或EOF 它们如何避免阻塞执行线程 根据文档,在为底层文件描述符设置O_nonblock之后,read_nonblock将使用read2系统调用 它们如何与Kernelselect方法配合使用 还有。在这种情况下,我们可以使用它来等待输入数据的可用性,以便后续的read_nonblock不会导致错误。如果存在多个输入流,并且不知道下一个将从哪个流数据到达,以及必须调用哪个读取,那么这一点尤其有用