HTTP请求超时

3 投票
4 回答
29527 浏览
提问于 2025-04-11 19:46

在Python 2.6中,httplib.HTTPConnection类新增了一个“超时”参数:http://docs.python.org/library/httplib.html#httplib.HTTPConnection

不过,这个超时参数只是用来设置与服务器连接的时间限制。我想要的是为请求设置一个超时值,而不是连接的超时。看起来httplib并不支持这个功能。

有没有什么办法可以模拟这种行为呢?

4 个回答

5

你也可以在连接的套接字上使用 settimeout(这个方法在 Python 2.5 中可以用):

connection = HTTPConnection('slow.service.com')
connection.request(...)
connection.sock.settimeout(5.0)
response = connection.getresponse()
response.read()
connection.close()

如果服务器在 5 秒内没有发送回应,就会出现一个 socket.error 的错误。

7

不,没有这样的东西。

这是因为HTTP规范并没有提供让客户端在发送HTTP请求时指定生存时间的信息。你只能在TCP层面上做到这一点,正如你提到的。

另一方面,服务器可以通过HTTP状态码来告诉客户端超时的情况,比如408 请求超时504 网关超时

9

你可以设置一个全局的套接字超时时间 (*)

import socket

timeout = 10
socket.setdefaulttimeout(timeout)

(*) 补充说明: 正如评论中提到的,这在技术上是正确的,但它只有在涉及单个套接字操作的任务中才会有可预测的结果。一个HTTP请求包含多个套接字操作(比如DNS请求或其他可能被HTTP客户端隐藏的操作)。因此,整个操作的超时时间就变得不可预测了。

撰写回答