2010-11-15 82 views
5

我想测试我的应用程序在通过urllib2获取数据时对超时的处理,我想用某种方法强制请求超时。如何强制urllib2超时?

找不到非常非常慢的互联网连接,我可以使用什么方法?

我似乎记得一个有趣的应用程序/套件模拟这些事情。也许有人知道这个链接?

+0

这里是一个[slow_http_server.py'的代码示例](http://stackoverflow.com/a/32685765/4279) – jfs 2015-09-21 01:12:23

回答

10

我通常使用netcat来听我的本地机器的端口80:

nc -l 80 

然后我在我的应用程序中使用http://localhost/作为请求URL。 Netcat将在http端口回答,但不会回复,所以如果您在urllib2.urlopen()呼叫中指定了超时或通过呼叫socket.setdefaulttimeout(),则该请求将保证超时。

+0

非常好。从来没有想到这一点! – 2010-11-15 21:06:35

+0

我不得不使用:nc -l -p 80虽然好主意!谢谢。 – mhost 2012-11-08 20:17:23

+0

是的,老版本的netcat有一些略有不同的命令行选项,IIRC。很高兴工作! – 2012-11-09 02:32:14

0

为什么不在bash中编写一个非常简单的CGI脚本,它只是在需要的超时时间内休眠?

3
import socket 

socket.setdefaulttimeout(2) # set time out to 2 second. 

如果你想设置超时的每一个请求,你可以使用的超时参数为urlopen

+0

有一点需要注意的是urlopen的超时参数仅在Python 2.6中添加了 – mhost 2012-11-08 20:18:45

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.timeout异常

0

如果您在Mac上运行,speedlimit是非常酷。

还有dummynet。它更加强硬,但它也可以让你做一些更有趣的事情。这是一个pre-configured VM image

如果你已经在Linux上运行,那么有netem

我相信我听说过一种叫做TrafficShaper的基于Windows的工具,但那个我没有验证过。