读取时,非阻塞Python套接字的超时值是多少



我使用的是Python 2.7,并且正在使用一些遗留代码。它在非阻塞模式下设置一个插座,带有:

self._socket.setblocking(0)
self._socket.settimeout(0)

我的问题是,在进行读取时,是什么决定了套接字的超时?它会是操作系统上TCP堆栈使用的默认值吗?如果是这样的话,在Linux上会如何改变呢?此外,写入超时与读取超时是否相同?

根据文档(强调矿):

在非阻塞模式下,如果recv()调用找不到任何数据,或者send()调用不能立即处理数据,error异常被提起。

因此,"超时"似乎是一种即时检查。如果在调用函数时没有可用的数据,或者无法准确地进行写入,则会收到一个异常。

以下是socket.settimeout 的帮助

socket的settimeout(…)方法_套接字对象实例设置超时

设置套接字操作的超时。'timeout’可以是浮点,以秒为单位给予,或无。将超时设置为None将禁用超时特性,相当于CCD_ 5。将超时设置为零与setblocking(0)相同。

所以我不知道为什么setblocking(0)settimeout(0)都是上面做的。这意味着如果没有可用的数据,read将立即返回EAGAINEWOULDBLOCK。当另一端关闭连接时,read将返回值0

读取超时只有在"阻塞"状态下才有意义,在该状态下,当超过等于超时的时间且没有数据可读取时,读取应返回EAGAINEWOULDBLOCK

一般来说,这不会影响write超时。当您将套接字设置为非阻塞时,如果"写缓冲区"已满(除非有一个相当"慢"的接收器,否则这种情况很少发生),如果write可能会阻塞,它应该立即返回EAGAINEWOULDBLOCK,然后应用程序有责任确保再次发出write

相关内容

  • 没有找到相关文章

最新更新