Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
关于rubys IO(读/写)的混淆\u非阻塞调用_Ruby_Sockets - Fatal编程技术网

关于rubys IO(读/写)的混淆\u非阻塞调用

关于rubys IO(读/写)的混淆\u非阻塞调用,ruby,sockets,Ruby,Sockets,我目前正在为奥丁项目做这个项目。目标是实现一个非常基本的Web服务器,它解析并响应GET或POST请求 我的解决方案使用IOgets和IOreadmaxlen以及Content-Length头属性来进行解析 其他解决方案使用IOread_非块。我在谷歌上搜索过它,但对它的文档感到非常困惑。它经常与Kernelselect一起提到,这也没有真正的帮助 有人能给我解释一下非块调用与普通调用有什么不同,它们如何避免阻塞执行线程,以及它们如何与Kernelselect方法一起使用吗?在阻塞写入中,您等待

我目前正在为奥丁项目做这个项目。目标是实现一个非常基本的Web服务器,它解析并响应GET或POST请求

我的解决方案使用IOgets和IOreadmaxlen以及Content-Length头属性来进行解析

其他解决方案使用IOread_非块。我在谷歌上搜索过它,但对它的文档感到非常困惑。它经常与Kernelselect一起提到,这也没有真正的帮助


有人能给我解释一下非块调用与普通调用有什么不同,它们如何避免阻塞执行线程,以及它们如何与Kernelselect方法一起使用吗?

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

向我解释非阻塞调用与正常调用的不同之处

行为上的关键区别在于,在调用时没有数据可读取,但在EOF时没有数据可读取:

引发异常类型的IO::WaitReadable 正常等待,直到读取长度字节或EOF 它们如何避免阻塞执行线程

根据文档,在为底层文件描述符设置O_nonblock之后,read_nonblock将使用read2系统调用

它们如何与Kernelselect方法配合使用

还有。在这种情况下,我们可以使用它来等待输入数据的可用性,以便后续的read_nonblock不会导致错误。如果存在多个输入流,并且不知道下一个将从哪个流数据到达,以及必须调用哪个读取,那么这一点尤其有用