2008-11-05 252 views
2

在Python 2.6,一个新的“超时”参数被添加到httplib.HTTPConnection类: http://docs.python.org/library/httplib.html#httplib.HTTPConnectionHTTP请求超时

然而,这仅仅是用于连接到服务器的超时。我期待为请求设置超时值,而不是连接。这似乎没有被httplib支持。

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

+0

相关:[读取超时使用urllib2或任何其他http库](http://stackoverflow.com/q/9548869/4279) – jfs 2015-09-21 01:05:08

回答

9

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

import socket 

timeout = 10 
socket.setdefaulttimeout(timeout) 

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

+0

如果我设置一个套接字超时,所有HTTP请求发送从httplib超时后我设定的价值? – 2008-11-05 16:49:49

+0

这应该会影响* all *套接字操作。 – Tomalak 2008-11-05 17:01:37

7

不,没有。

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

另一方面,服务器可能会通知客户端有关HTTP状态码408 Request Timeout或相应的超时情况。 504 Gateway Timeout

4

你也可以连接的插座(与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将提高。