1

基本上:有没有办法告诉(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 来区分原因?

4

1 回答 1

2

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

摊位

如果 90 秒后没有收到任何数据(包括换行符),则根据下一节中的退避策略立即断开连接并重新连接。Streaming API 将每 30 秒发送一个 keep-alive 换行符,以防止您的应用程序超时连接。

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

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

于 2012-09-26T20:21:21.823 回答