基本上:有没有一种方法可以告诉(Python 2.7)套接字何时超时,是因为没有任何东西传递到套接字还是因为网络连接中断?
我有一个Python应用程序,它将连接到Twitter流API很长一段时间(>30天)。每当发送推文时,应用程序都会从套接字的缓冲区中读取,但如果没有发送推文,则读取命令将超时并抛出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秒内没有读取tweet,resp.read
命令将超时并抛出SSLError,因此我忽略(通过返回None,这是从该代码段向上一级处理的),然后再读取30秒。问题是,如果网络断开连接,即使不久后重新连接,套接字似乎永远不会重新开始读取,只是继续超时。解决这个问题的唯一方法是重新连接,这很好,因为网络断开连接的情况很少见。我可以把超时设置得很高,每次超时都重新连接,但这会增加我的应用程序无法运行的时间,因为有人拔出了网络电缆。我可以将超时设置为较低,以最大限度地减少停机时间,但当没有阅读推文时,我会不必要地重新连接。
有没有一种方法可以根据抛出的SSLError来区分原因?
OP此处。我仍然不知道如何区分超时发生的原因,但我确实在推特流媒体文档中找到了一些有用的东西,解决了我的根本问题。
暂停
如果90秒过去而没有接收到包括换行符在内的数据,根据退避立即断开并重新连接策略。流API将发送每隔30秒保持换行符有效,以防止应用程序使连接超时。
因此,基本上,将超时时间设置为大于30秒(Twitter建议为90秒)将解决此问题,因为他们将每30秒发送一次"心跳",以确保客户端的流连接仍然有效。然后,无论何时您确实看到超时,都可以安全地开始重新连接过程。
我仍然想知道SSLErrors内部是否有任何区别,但为了防止有人遇到与我相同的问题,我认为这可能会有所帮助。