gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-01 05:55:52 25 4
gpt4 key购买 nike

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

我有一个 Python 应用程序,它将长时间(> 30 天)连接到 Twitter Streaming 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来区分原因?

最佳答案

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

Stalls

If 90 seconds pass with no data received, including newlines, disconnect and reconnect immediately according to the backoff strategies in the next section. The Streaming API will send a keep-alive newline every 30 seconds to prevent your application from timing out the connection.

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

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

关于Python-套接字超时原因?网络连接丢失或无法阅读?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12604254/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com