【发布时间】:2023-11-14 17:33:01
【问题描述】:
我想在通过 urllib2 抓取数据时测试我的应用程序对超时的处理,并且我想有一些方法来强制请求超时。
找不到非常慢的互联网连接,我可以使用什么方法?
我似乎记得一个有趣的应用程序/套件来模拟这些事情。也许有人知道链接?
【问题讨论】:
我想在通过 urllib2 抓取数据时测试我的应用程序对超时的处理,并且我想有一些方法来强制请求超时。
找不到非常慢的互联网连接,我可以使用什么方法?
我似乎记得一个有趣的应用程序/套件来模拟这些事情。也许有人知道链接?
【问题讨论】:
我通常使用 netcat 监听本地机器的 80 端口:
nc -l 80
然后我在我的应用程序中使用http://localhost/ 作为请求 URL。 Netcat 将在 http 端口响应,但永远不会给出响应,因此如果您在 urllib2.urlopen() 调用或调用 socket.setdefaulttimeout() 中指定了超时,则可以保证请求超时。
【讨论】:
您可以如上所示设置默认超时,但您可以混合使用两者,因为 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 异常
【讨论】:
import socket
socket.setdefaulttimeout(2) # set time out to 2 second.
如果你想为每个请求设置超时,你可以使用urlopen的超时参数
【讨论】:
为什么不在 bash 中编写一个非常简单的 CGI 脚本,它只在所需的超时时间内休眠?
【讨论】:
如果您在 Mac 上运行,speedlimit 非常酷。
还有dummynet。它更加硬核,但它也可以让你做一些更有趣的事情。这是pre-configured VM image。
如果您已经在 Linux 机器上运行,则有 netem。
我相信我听说过一种名为 TrafficShaper 的基于 Windows 的工具,但我还没有验证过。
【讨论】: