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

时间:2015-06-30 14:30:15

标签: python sockets networking tcp timeout

我正在使用Python 2.7并正在使用一些遗留代码。它使用以下命令设置非阻塞模式的套接字:

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

我的问题是,在读取时,是什么决定套接字的超时?它是OS上TCP堆栈使用的默认值吗?如果是这样,在Linux上将如何改变?此外,写入超时是否与读取超时相同?

2 个答案:

答案 0 :(得分:2)

根据documentation(强调我的):

  

在非阻止模式下,如果recv()呼叫未找到任何数据,或者如果a   send()调用无法立即处理数据,error例外   被提出来了。

所以好像"超时"是一个瞬间检查。如果没有可用的数据或者在您调用该函数时无法完全写入,则会收到异常。

答案 1 :(得分:2)

以下是socket.settimeout

的帮助
  

socket._socketobject实例的settimeout(...)方法        的setTimeout(超时)

     

设置套接字操作的超时。 'timeout'可以是浮点数,      在几秒钟内给出,或者无。将超时设置为无禁用     超时功能相当于setblocking(1)。      将超时设置为零与setblocking(0)相同。

所以我不确定为什么setblocking(0)settimeout(0)两者都在上面完成。这意味着如果没有可用数据,read会立即返回EAGAINEWOULDBLOCK。当另一端关闭连接时,read将返回值0

读取超时仅在“阻塞”状态下有意义,在超过超时的时间过后且没有数据要读取时,读取应返回EAGAINEWOULDBLOCK

一般来说,这不会影响write超时。当你将socket设置为非阻塞并且'write buffers'已经满了(这很少会发生,除非有一个相当'慢'的接收器)并且如果write可能阻塞,它应该立即返回{ {1}}或EAGAIN然后在应用程序上有责任确保再次发出EWOULDBLOCK