在Python 2.6,一个新的“超时”参数被添加到httplib.HTTPConnection类: http://docs.python.org/library/httplib.html#httplib.HTTPConnectionHTTP请求超时
然而,这仅仅是用于连接到服务器的超时。我期待为请求设置超时值,而不是连接。这似乎没有被httplib支持。
有什么办法可以模拟这种行为吗?
在Python 2.6,一个新的“超时”参数被添加到httplib.HTTPConnection类: http://docs.python.org/library/httplib.html#httplib.HTTPConnectionHTTP请求超时
然而,这仅仅是用于连接到服务器的超时。我期待为请求设置超时值,而不是连接。这似乎没有被httplib支持。
有什么办法可以模拟这种行为吗?
您可以设置一个全局套接字超时(*):
import socket
timeout = 10
socket.setdefaulttimeout(timeout)
(*)编辑:随着人们在评论正确地指出:这在技术上是真实的,但对于涉及单个套接字操作的任务,它只具有可预测的结果。一个HTTP请求由多个套接字操作组成(例如DNS请求或其他可能从HTTP客户端抽象出来的东西)。因此,整体操作的超时变得不可预测。
如果我设置一个套接字超时,所有HTTP请求发送从httplib超时后我设定的价值? – 2008-11-05 16:49:49
这应该会影响* all *套接字操作。 – Tomalak 2008-11-05 17:01:37
不,没有。
这是因为HTTP spec没有提供任何内容让客户端通过HTTP请求指定生存时间信息。正如您所提到的,您只能在TCP级别上执行此操作。
另一方面,服务器可能会通知客户端有关HTTP状态码408 Request Timeout或相应的超时情况。 504 Gateway Timeout。
你也可以连接的插座(与Python 2.5工程)上使用settimeout
:
connection = HTTPConnection('slow.service.com')
connection.request(...)
connection.sock.settimeout(5.0)
response = connection.getresponse()
response.read()
connection.close()
如果服务器不能送5秒内响应,socket.error
将提高。
相关:[读取超时使用urllib2或任何其他http库](http://stackoverflow.com/q/9548869/4279) – jfs 2015-09-21 01:05:08