我有一个主机名列表,我想在大约一秒的时间间隔内检查这些机器是否正在运行。
到目前为止我所拥有的是这一点,但离线机器上的超时需要几秒钟时间:
socket.setdefaulttimeout(0)
def resolve_hostname(hostname):
try:
return socket.gethostbyname(hostname)
except socket.error:
return False
不好,因为该列表有大约30台机器。
任何想法如何加快速度?
谢谢!
答案 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()