DNS超时在“请求” python库上

Kan*_*ium 5 python dns python-requests

对于我的项目,我必须检查网站的状态(在共享主机上)。

我使用Python请求库。

def getStatusCode(url):
    try:
        return requests.head(url,timeout=0.3).status_code
    except:
        return -1
Run Code Online (Sandbox Code Playgroud)

此代码在MacOS 10.10和Python3.4(带有类似http://www.google.com的网址)下的效果很好。如果拔下ISP电缆,则会立即出现异常。

在具有Python3.4的Ubuntu Server 14.04下,如果拔下ISP电缆,则永远不会收到超时错误。Raspbian上的同样问题。

经过一些测试,如果我用IP http://216.58.212.100替换了URL ,Ubuntu Server会给我一个例外,但是由于我位于共享的Web托管上,所以我不能使用IP。

经过一番研究,我发现请求库中的超时与DNS查找之间没有区别,不是由它执行而是由操作系统执行。

所以我的问题是解决这个问题的最美丽的方法是什么?我是否需要在Python中添加额外的超时异常,例如:函数调用超时

谢谢

Cha*_*lie 0

现在我对你的问题有了更好的理解 - 我认为有一个更好的方法是使用你的操作系统 ping 应用程序,这在 Python 中应该不难做到 -例如。您还应该平均 1000 个请求,并查看平均值、标准差、异常值等。这样做的原因是,如果一个请求需要 500 毫秒,而您想要 1 毫秒的分辨率,则需要生成至少 500 个请求才能获得任何内容接近你想要的分辨率。

使用 Python urllib(2) 的问题是,它的执行效果几乎不如系统级调用,因此您将很难生成足够的线程来获得所需的计时分辨率。

最后,我会再次使用商业产品检查您的结果,以确保您的结果相似。例如(无隶属关系): http://www.thinkbroadband.com/ping