请求进程挂起

时间:2016-08-30 12:41:08

标签: python python-requests

我使用requests获取网址,例如:

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

为什么会这样?有解决方案吗?

2 个答案:

答案 0 :(得分:5)

您发送timeout的服务器似乎限制了您 - 也就是说,它在每个包之间发送timeout的时间少于1秒(因此不是触发你的latency参数),但速度足够慢,似乎卡住了。

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

请注意,在设置TStream参数时,您需要考虑TFileStream,否则您的连接将被删除太快,可能根本不起作用。

答案 1 :(得分:0)

默认请求未设置连接或读取超时。 如果由于某种原因服务器无法在一定时间内返回客户端,则客户端将停留在连接或读取状态,主要是响应读取。

快速解决方案是在请求对象中设置超时值,此方法在此处进行了很好的描述:http://docs.python-requests.org/en/master/user/advanced/#timeouts (感谢大家。)

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