如何强制urllib2超时?

6

我想测试我的应用程序在通过urllib2获取数据时处理超时的能力,并希望有一种方法来强制请求超时。

除了找到一个非常缓慢的互联网连接之外,我可以使用什么方法?

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


这是一个关于slow_http_server.py代码示例 - jfs
5个回答

10

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

nc -l 80

然后我在我的应用程序中使用 http://localhost/ 作为请求URL。Netcat会在http端口上响应,但永远不会给出响应,所以只要您在urllib2.urlopen()调用中指定了超时时间或通过调用socket.setdefaulttimeout()设置了超时时间,就可以保证请求超时。


非常好,从未想过这个! - jcomeau_ictx
我不得不使用:nc -l -p 80。虽然是个好主意!谢谢。 - mhost
是的,如果我没记错,旧版本的netcat命令行选项略有不同。很高兴它能正常工作! - ʇsәɹoɈ

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


3
import socket 

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

如果您想为每个请求设置超时时间,可以使用urlopen的timeout参数。


需要记住的一件事是,urlopen的超时参数仅在Python 2.6中添加。 - mhost

0

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


0

如果你在使用Mac,speedlimit非常酷。

还有dummynet。它更加专业,但也能让你做一些非常有趣的事情。这里有一个预配置的虚拟机镜像

如果你已经在使用Linux系统,那么可以使用netem

我听说过一个名为TrafficShaper的基于Windows的工具,但我没有验证过。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接