【问题标题】:How can I force urllib2 to time out?如何强制 urllib2 超时?
【发布时间】:2023-11-14 17:33:01
【问题描述】:

我想在通过 urllib2 抓取数据时测试我的应用程序对超时的处理,并且我想有一些方法来强制请求超时。

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

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

【问题讨论】:

标签: python urllib2


【解决方案1】:

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

nc -l 80

然后我在我的应用程序中使用http://localhost/ 作为请求 URL。 Netcat 将在 http 端口响应,但永远不会给出响应,因此如果您在 urllib2.urlopen() 调用或调用 socket.setdefaulttimeout() 中指定了超时,则可以保证请求超时。

【讨论】:

  • 非常好。没想到!
  • 我不得不使用:nc -l -p 80 不过好主意!谢谢。
  • 是的,旧版本的 netcat 命令行选项略有不同,IIRC。很高兴它成功了!
【解决方案2】:

您可以如上所示设置默认超时,但您可以混合使用两者,因为 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 异常

【讨论】:

    【解决方案3】:
    import socket 
    
    socket.setdefaulttimeout(2) # set time out to 2 second.
    

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

    【讨论】:

    • 要记住的一点是 urlopen 的超时参数仅在 Python 2.6 中添加
    【解决方案4】:

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

    【讨论】:

      【解决方案5】:

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

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

      如果您已经在 Linux 机器上运行,则有 netem

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

      【讨论】: