HTTP Request Timeout
在Python 2.6中,一个新的"timeout"参数被添加到httplib.HTTPConnection类中:
http://docs.python.org/library/httplib.html#httplib.HTTPConnection
但是,这只是连接到服务器的超时。 我期待为请求设置超时值,而不是连接。 httplib似乎不支持这一点。
有没有办法模仿这种行为?
您可以设置全局套接字超时(*):
1 2 3 4 | import socket timeout = 10 socket.setdefaulttimeout(timeout) |
(*)编辑:正如评论中的人正确地指出:这在技术上是正确的,但它只对涉及单个套接字操作的任务具有可预测的结果。 HTTP请求由多个套接字操作组成(例如,DNS请求或可能从HTTP客户端抽象出来的其他事物)。因此,整个操作的超时变得不可预测。
不,没有。
这是因为HTTP规范没有为客户端提供任何指定HTTP请求的生存时间信息的内容。如上所述,您只能在TCP级别执行此操作。
另一方面,服务器可以通过HTTP状态代码408 Request Timeout resp来通知客户端超时情况。 504网关超时。
您还可以在连接的套接字上使用
1 2 3 4 5 6 | connection = HTTPConnection('slow.service.com') connection.request(...) connection.sock.settimeout(5.0) response = connection.getresponse() response.read() connection.close() |
如果服务器无法在5秒内发送响应,则会引发
当您启动连接时,可以将timout值作为第三个参数。
1 2 | connection = HTTPConnection(<IP of URL>, <port or None>, <timeout>) ... |
是一个浮动秒。
1 | connection = HTTPConnection('slow.service.com', None, 20.0) |