HTTP请求超时

时间:2008-11-05 16:30:23

标签: python http

在Python 2.6中,httplib.HTTPConnection类添加了一个新的“timeout”参数: http://docs.python.org/library/httplib.html#httplib.HTTPConnection

但是,这只是与服务器连接的超时。我期待为请求设置超时值,而不是连接。这似乎不受httplib支持。

有没有办法模仿这种行为?

4 个答案:

答案 0 :(得分:9)

您可以设置全局套接字超时(*)

import socket

timeout = 10
socket.setdefaulttimeout(timeout)

(*) 编辑:正如评论中的人正确指出:这在技术上是正确的,但它只对涉及单个套接字操作的任务有可预测的结果。 HTTP请求由多个套接字操作组成(例如,DNS请求或可能从HTTP客户端抽象出来的其他事物)。由于这个原因,整个操作的超时变得不可预测。

答案 1 :(得分:7)

不,没有。

这是因为HTTP spec没有为客户端提供任何指定HTTP请求的生存时间信息的内容。如上所述,您只能在TCP级别执行此操作。

另一方面,服务器可以通过HTTP状态代码408 Request Timeout来通知客户端超时情况。 504 Gateway Timeout

答案 2 :(得分: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

答案 3 :(得分:0)

启动连接时,可以将timout值作为第三个参数。

connection = HTTPConnection(<IP of URL>, <port or None>, <timeout>)
...

是以秒为单位的浮点数。

connection = HTTPConnection('slow.service.com', None, 20.0)