我使用的是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
将立即返回EAGAIN
或EWOULDBLOCK
。当另一端关闭连接时,read
将返回值0
。
读取超时只有在"阻塞"状态下才有意义,在该状态下,当超过等于超时的时间且没有数据可读取时,读取应返回EAGAIN
或EWOULDBLOCK
。
一般来说,这不会影响write
超时。当您将套接字设置为非阻塞时,如果"写缓冲区"已满(除非有一个相当"慢"的接收器,否则这种情况很少发生),如果write
可能会阻塞,它应该立即返回EAGAIN
或EWOULDBLOCK
,然后应用程序有责任确保再次发出write
。