Я хочу выполнить большое количество обратных DNS-запросов за небольшой промежуток времени. В настоящее время я реализовал асинхронный поиск с использованием пула потоков socket.gethostbyaddr и concurrent.futures, но до сих пор не вижу желаемой производительности. Например, выполнение скрипта на 2500 IP-адресах заняло около 22 минут.
Мне было интересно, есть ли более быстрый способ сделать это, не прибегая к чему-то вроде adns-python. Я нашел этот http://blog.schmichael.com/2007/09/18/a-lesson-on-python-dns-and-threads/, который предоставил дополнительную информацию.
Фрагмент кода:
ips = [...]
with concurrent.futures.ThreadPoolExecutor(max_workers = 16) as pool:
list(pool.map(get_hostname_from_ip, ips))
def get_hostname_from_ip(ip):
try:
return socket.gethostbyaddr(ip)[0]
except:
return ""
Я думаю, что часть проблемы заключается в том, что многие IP-адреса не разрешаются и время ожидания истекло. Я старался:
socket.setdefaulttimeout(2.0)
но, похоже, это не имеет никакого эффекта.