Python套接字超时原因?网络连接丢失或无法读取?

Python套接字超时原因?网络连接丢失或无法读取?,python,twitter,twitter-streaming-api,Python,Twitter,Twitter Streaming Api,基本上:有没有一种方法可以告诉(Python2.7)套接字何时超时,是因为没有向套接字发送任何内容,还是因为网络连接中断 我有一个Python应用程序,可以长时间(大于30天)连接到Twitter流API。每当发送tweet时,应用程序都会从套接字的缓冲区读取,但如果没有发送tweet,read命令将超时并抛出SSLError 下面是一个发生读取/超时的片段: try: d = resp.read(1) return d except SSLErr

基本上:有没有一种方法可以告诉(Python2.7)套接字何时超时,是因为没有向套接字发送任何内容,还是因为网络连接中断

我有一个Python应用程序,可以长时间(大于30天)连接到Twitter流API。每当发送tweet时,应用程序都会从套接字的缓冲区读取,但如果没有发送tweet,read命令将超时并抛出
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秒钟。问题是,如果网络断开连接,即使不久后重新连接,套接字似乎永远不会再次开始读取,而是继续超时。解决此问题的唯一方法是重新连接,这很好,因为网络断开很少。我可以将超时设置得很高,然后在每次超时时重新连接,但这会增加我的应用程序无法运行的时间,因为有人拔出了网线。我可以将超时设置得很低,以尽量减少停机时间,但是当没有读到推文时,我会不必要地重新连接


有没有办法根据抛出的错误来区分原因?

OP here。仍然不知道如何区分超时发生的原因,但我确实设法在中找到了一些有用的方法来解决我遇到的根本问题

暂停

如果90秒过后没有收到任何数据,包括换行符, 根据退避,立即断开并重新连接 战略将在下一节介绍。流式API将发送一个 每30秒更新一次,以防止应用程序 连接超时

因此,基本上,将超时时间设置为大于30秒(Twitter建议为90秒)将解决此问题,因为他们将每30秒发送一次“心跳”,以确保客户端流式连接仍然有效。然后,只要确实看到超时,就可以安全地启动重新连接过程

我仍然想知道SSLErrors中是否有任何区别,但万一有人遇到与我相同的问题,我想这可能会有所帮助