【问题标题】:Python - Socket Timeout reason? Network connection loss or nothing to read?Python - 套接字超时原因?网络连接丢失或无阅读内容?
【发布时间】:2012-09-26 14:40:17
【问题描述】:

基本上:有没有办法告诉(Python 2.7)套接字何时超时,是因为没有向套接字传递任何内容还是因为网络连接断开?

我有一个 Python 应用程序,它将长时间(>30 天)连接到 Twitter 流 API。每当发送推文时,应用程序都会从​​套接字的缓冲区读取,但如果没有发送推文,则读取命令将超时并抛出 SSLError

这是读取/超时发生的 sn-p:

    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,这是从这个 sn-p 处理的上一级)然后再读取 30 秒.问题是,如果网络断开连接,即使它在不久之后重新连接,套接字似乎也不会再次开始读取,只会继续超时。解决此问题的唯一方法是重新连接,这很好,因为网络断开连接很少见。我可以将超时设置得非常高,并在每次超时时重新连接,但这会增加我的应用程序无法运行的时间,因为有人拔掉了网络电缆。我可以将超时设置为低以最大程度地减少停机时间,但是当没有阅读任何推文时,我会不必要地重新连接。

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

【问题讨论】:

    标签: python twitter twitter-streaming-api


    【解决方案1】:

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

    摊位

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-06-04
      • 1970-01-01
      • 1970-01-01
      • 2017-10-29
      • 2013-09-02
      • 1970-01-01
      • 1970-01-01
      • 2016-02-14
      相关资源
      最近更新 更多