基本上:有没有办法告诉(Python 2.7)套接字何时超时,是因为没有任何东西传递到套接字还是因为网络连接断开?
我有一个 Python 应用程序,它将长时间(>30 天)连接到 Twitter 流 API。每当发送推文时,应用程序都会从套接字的缓冲区中读取,但如果没有发送推文,则读取命令将超时并抛出SSLError
.
这是发生读取/超时的片段:
try:
d = resp.read(1)
return d
except SSLError as e:
# the read timed out, nothing was read
return None
except Exception as e:
log.error('Error reading from stream : {0}'.format(e))
我在创建时设置了超时HTTPSConnection
,目前设置为 30 秒。因此,如果 30 秒内没有阅读任何推文,则resp.read
命令将超时并抛出 SSLError,因此我忽略(通过返回 None,这是从该代码段向上处理的一个级别),然后再读取 30 秒。问题是,如果网络断开连接,即使它在不久之后重新连接,套接字似乎也不会再次开始读取,只会继续超时。解决此问题的唯一方法是重新连接,这很好,因为网络断开连接很少见。我可以将超时设置得非常高,并在每次超时时重新连接,但这会增加我的应用程序无法运行的时间,因为有人拔掉了网络电缆。我可以将超时设置为低以最大限度地减少停机时间,但是当没有阅读任何推文时,我会不必要地重新连接。
有没有办法根据抛出的 SSLError 来区分原因?