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

时间:2012-09-26 14:40:17

标签: python twitter twitter-streaming-api

基本上:有没有办法告诉(Python 2.7)什么时候套接字超时,因为没有任何东西被传递到套接字或因为网络连接断开?

我有一个Python应用程序,可以长时间(> 30天)连接到Twitter Streaming API。无论何时传递推文,应用程序都会从​​套接字缓冲区读取,但如果没有传递推文,则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秒内没有读取推文,resp.read命令将超时并抛出SSLError,所以我忽略(通过返回None,从此片段处理一级),然后再读取30秒。问题是,如果网络断开连接,即使它很快就重新连接,套接字似乎也不会再次开始读取而只是继续超时。解决此问题的唯一方法是重新连接,这很好,因为网络断开很少。我可以将超时设置得非常高并且只是在每次超时时重新连接,但这会增加我的应用程序无法正常工作的时间,因为有人拉出网络电缆。我可以将超时设置为低以最小化停机时间,但是当没有读取推文时我会不必要地重新连接。

有没有办法根据抛出的SSLError区分原因?

1 个答案:

答案 0 :(得分:2)

OP在这里。仍然不知道如何区分发生超时的原因,但我确实找到了Twitter Streaming Docs中有用的东西来解决我遇到的根本问题。

  

<强>摊位

     

如果在没有收到数据的情况下通过90秒,包括换行,   根据退避立即断开连接并重新连接   策略在下一节中。 Streaming API将发送一个   每隔30秒保持生命线,以防止您的申请   超时连接。

所以基本上,将超时设置为大于30秒的时间(Twitter推荐90)将解决它,因为他们将每隔30秒发送一次“心跳”,以确保客户端流连接仍然存在。然后,只要您确实看到超时,就可以安全地启动重新连接过程。

仍然想知道SSLErrors中是否有任何区别但是如果有人遇到同样的问题,我认为这可能会有所帮助。