用requests诊断挂起的请求

1 投票
1 回答
1331 浏览
提问于 2025-04-18 14:10

我看到有很多帖子讨论如何通过设置超时来处理请求挂起的问题,但我不太确定怎么判断我的请求是挂起了,还是有其他潜在的问题。我正在流式传输一些数据,同时也在记录这些数据并打印到控制台。到目前为止,我已经遇到过两次长时间没有数据打印到控制台的情况,当我中断执行时,得到了以下的错误信息:

  File "/home/matthew/Dropbox/pylibs/oandapy/oandapy.py", line 276, in start
    for line in response.iter_lines(90):
  File "/home/matthew/anaconda/lib/python2.7/site-packages/requests/models.py", line 663, in iter_lines
    for chunk in self.iter_content(chunk_size=chunk_size, decode_unicode=decode_unicode):
  File "/home/matthew/anaconda/lib/python2.7/site-packages/requests/models.py", line 627, in generate
    for chunk in self.raw.stream(chunk_size, decode_content=True):
  File "/home/matthew/anaconda/lib/python2.7/site-packages/requests/packages/urllib3/response.py", line 240, in stream
    data = self.read(amt=amt, decode_content=decode_content)
  File "/home/matthew/anaconda/lib/python2.7/site-packages/requests/packages/urllib3/response.py", line 187, in read
    data = self._fp.read(amt)
  File "/home/matthew/anaconda/lib/python2.7/httplib.py", line 543, in read
    return self._read_chunked(amt)
  File "/home/matthew/anaconda/lib/python2.7/httplib.py", line 585, in _read_chunked
    line = self.fp.readline(_MAXLINE + 1)
  File "/home/matthew/anaconda/lib/python2.7/socket.py", line 476, in readline
    data = self._sock.recv(self._rbufsize)
  File "/home/matthew/anaconda/lib/python2.7/ssl.py", line 246, in recv
    return self.read(buflen)
  File "/home/matthew/anaconda/lib/python2.7/ssl.py", line 165, in read
    return self._sslobj.read(len)

我可以设置一些额外的参数,或者在哪里记录更多关于连接的信息吗?从这个错误信息中,我不太清楚问题出在哪里。

1 个回答

1

在创建请求对象或者发送请求的时候,你可以设置HTTP会话的超时时间;具体可以参考这里

timeout – (可选)一个浮点数,表示请求的超时时间,单位是秒。

不过,看起来在传输过程中可能出现了问题。为了测试,你可以在iter_lines中传入chunk_size=1,然后立即打印结果。也有可能是服务器没有发送HTTP的分块结束符\r\n(如果你有自己的服务器,可以检查一下?也可以尝试通过https连接其他服务器)。

撰写回答