【问题标题】:requests process hangs请求进程挂起
【发布时间】:2017-01-06 18:11:30
【问题描述】:

我用requests来获取一个URL,比如:

while True:
    try:
        rv = requests.get(url, timeout=1)
        doSth(rv)
    except socket.timeout as e:
        print e
    except Exception as e:
        print e

运行一段时间后,它退出工作。没有异常或任何错误,就像它被暂停一样。然后,我通过在控制台中键入 Ctrl+C 来停止该过程。说明进程正在等待数据:

  .............
   httplib_response = conn.getresponse(buffering=True) #httplib.py
   response.begin() #httplib.py
   version, status, reason = self._read_status() #httplib.py
   line = self.fp.readline(_MAXLINE + 1) #httplib.py
   data = self._sock.recv(self._rbufsize) #socket.py
KeyboardInterrupt

为什么会这样?有解决办法吗?

【问题讨论】:

  • 它正在等待服务器发送数据,您在客户端无能为力。也许服务器故意限制你?
  • 我想是的。而且我必须降低请求数据的频率,对吗?还有其他建议
  • Afait,这是您唯一的选择。请确保在设置 timeout - 10ms 时记住延迟,例如,这不太可能起作用。
  • 这个问题的回答是否令人满意?我只是说我遇到了同样的问题,因为我正在使用请求并且 URL 可以在浏览器中正常工作(将 json 列表返回到我的浏览器),但是当我通过请求“获取”相同的 URL 时,它只是挂起.. .
  • @Surest-Texas 当我遇到这个问题时,我尝试使用 UserAgent (stackoverflow.com/questions/27652543/…) 发送类似浏览器的标头,但它仍然不起作用。最终我意识到浏览器正在使用 https,而我所要做的就是在我的 requests.get() 调用中设置 https 而不是 http ... doh!

标签: python python-requests


【解决方案1】:

看来您发送request 的服务器正在限制您 - 也就是说,它发送bytes 的时间少于每个包之间的 1 秒(因此不会触发您的 timeout 参数),但速度很慢足以让它看起来卡住了。

我能想到的唯一解决方法是减少timeout 参数,除非您可以通过服务器提供程序解决此限制问题。

请记住,在设置timeout 参数时,您需要考虑latency,否则您的连接会很快断开并且可能根本无法工作。

【讨论】:

    【解决方案2】:

    默认请求不设置连接或读取超时。 如果由于某种原因,服务器无法在规定时间内回复客户端,客户端将卡在连接或读取,主要是读取响应。

    快速解决方法是在 requests 对象中设置一个超时值,该方法在这里有很好的描述:http://docs.python-requests.org/en/master/user/advanced/#timeouts (谢谢大家。)

    如果这解决了问题,请将此标记为解决方案。谢谢。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-01-14
      • 1970-01-01
      • 2022-12-12
      • 2021-10-22
      • 2016-08-09
      • 1970-01-01
      • 1970-01-01
      • 2018-10-28
      相关资源
      最近更新 更多