Я пытаюсь получить имена хостов сервера LAN, поэтому я могу запускать запрос по этим серверам с именем хоста:
import socket
IP_RANGE = 10
hostNamesList = []
socket.setdefaulttimeout(0.1)
for i in range(IP_RANGE):
try:
hostNamesList.append(socket.gethostbyaddr("192.168.1.%s" % i)[0])
except:
pass
print hostNamesList
Вышеприведенный код занимает несколько минут для сканирования выбранного диапазона IP, даже если я установил таймаут на 0,1 секунды.
Есть ли что-то, что я сделал не так, или каким-либо образом (-ам), чтобы быстрее получить имена хостов?
Вероятно, вы столкнулись с длинным поиском DNS или SAMBA (просто догадка). Это скорее поведение, связанное с сетью, а не python. Попробуйте запустить свой скрипт с помощью профайлера: python -m cProfile -s tottime lookup.py
Если моя догадка верна, вы увидите длинную _socket.gethostbyaddr
, тогда единственным хорошим вариантом является попытка параллельного использования вашего кода (или улучшение сетевых настроек для лучшего времени поиска).
Я решил свою проблему благодаря предложению Ян.
import socket
from threading import Thread
hostNamesList=[]
def searchForSingleIP(i):
try:
hostNamesList.append(socket.gethostbyaddr("192.168.1.%s" % str(i) )[0])
except:
pass
for i in range(256):
worker = Thread(target = searchForSingleIP, args = (i,))
worker.start()
worker.join(timeout=0.1)
print hostNamesList