短時間で多数の逆引き 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)
しかし、効果がないようです。