如何强制urllib2超时?
我想测试一下我的应用在通过urllib2获取数据时处理超时的能力,并且我想找个方法强制让请求超时。
除了找一个非常非常慢的网络连接,我还能用什么方法呢?
我好像记得有一个有趣的工具或者软件可以模拟这种情况。也许有人知道链接在哪里?
5 个回答
3
import socket
socket.setdefaulttimeout(2) # set time out to 2 second.
如果你想为每个请求设置一个超时时间,可以使用 urlopen 的 timeout 参数。
6
你可以像上面那样设置默认的超时时间,但从Python 2.6开始,urlopen方法里也有一个超时选项,所以你可以两者结合使用:
import urllib2
import socket
try:
response = urllib2.urlopen("http://google.com", None, 2.5)
except URLError, e:
print "Oops, timed out?"
except socket.timeout:
print "Timed out!"
urllib2的默认超时时间是无限的,而导入socket模块可以确保你能捕捉到超时的情况,这时候会抛出一个socket.timeout的异常。
10
我通常用netcat在我本地机器的80端口上监听:
nc -l 80
然后我在我的应用程序中使用http://localhost/作为请求的URL。netcat会在http端口上回应,但不会真正给出任何响应,所以只要你在调用urllib2.urlopen()
时设置了超时时间,或者通过调用socket.setdefaulttimeout()
来设置超时时间,请求就一定会超时。