2015-12-11 3 views
3

У меня есть список имен хостов, и я хочу проверить, работают ли эти машины или нет с интервалом около одной секунды.Быстрое имя хоста/IP-адрес в Python?

Что у меня до сих пор это, но тайм-аут на машинах, которые на форуме занимает несколько секунд:

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

Не хорошо, как список насчитывает около 30 машин.

Любые идеи, как ускорить работу?

Спасибо!

+1

Это классический прецедент для многопоточности. Запустите каждый запрос в новом потоке. Вы не можете получить таймауты, чтобы происходить все быстрее. – 101

+1

Насколько я могу судить, 'gethostbyname' просто ищет' hostname' и не подключается к хосту. Тайм-аут может не повлиять на него. Возможно ли, что разрешение имени занимает несколько секунд? – kai

+0

@ 101 спасибо, я посмотрю на это. – Till

ответ

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'] 
+0

Извините, но я не могу получить код для разрешения локальных имен хостов. Любая идея о том, как это сделать? Пробовал пару вещей, но запись всегда пуста. – Till

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() 
Смежные вопросы