Python中的快速主机名/ IP检查?

时间:2015-12-11 10:37:20

标签: python performance python-2.7

我有一个主机名列表,我想在大约一秒的时间间隔内检查这些机器是否正在运行。

到目前为止我所拥有的是这一点,但离线机器上的超时需要几秒钟时间:

socket.setdefaulttimeout(0)
def resolve_hostname(hostname):
    try:
        return socket.gethostbyname(hostname)
    except socket.error:
        return False

不好,因为该列表有大约30台机器。

任何想法如何加快速度?

谢谢!

2 个答案:

答案 0 :(得分:2)

我会考虑使用第三方群发DNS解析器,而不是自己编写代码。这是一个看起来很有希望的:

https://pypi.python.org/pypi/berserker_resolver/1.0.3

安装:

pip install berserker_resolver

以下是一个例子:

>>> import berserker_resolver
>>> resolver = berserker_resolver.Resolver()
>>> to_resolve = ['www.google.com', 'www.microsoft.com', 'www.facebook.com', 'invalid.invalid']
>>> resolver.resolve(to_resolve).keys()
['www.microsoft.com', 'www.facebook.com', 'www.google.com']

答案 1 :(得分:0)

我没有使用慢速名称查找连接尝试,但超时似乎完全符合socket.socket.connect()

import socket

def test_hostname(hostname, port, timeout=1.0):
    s = socket.socket()
    s.settimeout(timeout)
    try:
        s.connect((hostname, port))
    except (socket.timeout, socket.gaierror):
        return False
    else:
        return True
    finally:
        s.close()