我正在尝试进行几千次dns查询。我编写了我的脚本来使用python-adns。我试图添加线程和队列以确保脚本以最佳和有效的方式运行。
然而,我只能取得平庸的成绩。答复是不稳定/间歇性的。它们开始和停止,大多数时间停顿10到20秒。 tlock = threading.Lock()#printing to screen
def async_dns(i):
s = adns.init()
for i in names:
tlock.acquire()
q.put(s.synchronous(i, adns.rr.NS)[0])
response = q.get()
q.task_done()
if response == 0:
dot_net.append("Y")
print(i + ", is Y")
elif response == 300:
dot_net.append("N")
print(i + ", is N")
tlock.release()
q = queue.Queue()
threads = []
for i in range(100):
t = threading.Thread(target=async_dns, args=(i,))
threads.append(t)
t.start()
print(threads)
我花了无数个小时。我很感激来自expeienced pythonista的一些意见。这是一个网络问题吗?通过切换服务器可以解决这个瓶颈/间歇性响应吗?
感谢。
答案 0 :(得分:0)
如果没有问题的答案,我在上面的评论中问道,我不确定我能够很好地诊断你所看到的问题,但这里有一些想法:
names
而不只是处理它们的一部分。Queue
似乎什么也没做。我建议您使用multiprocessing.pool.ThreadPool
而不是尝试修复此代码吗?以下是一个完整的工作示例。 (如果您愿意,可以使用adns
代替socket
...我无法轻松安装它,因此无法使用内置的socket
。)
在我的测试中,我有时也会看到停顿;我的假设是我在某个地方被扼杀了。
import itertools
from multiprocessing.pool import ThreadPool
import socket
import string
def is_available(host):
print('Testing {}'.format(host))
try:
socket.gethostbyname(host)
return False
except socket.gaierror:
return True
# Test the first 1000 three-letter .com hosts
hosts = [''.join(tla) + '.com' for tla in itertools.permutations(string.ascii_lowercase, 3)][:1000]
with ThreadPool(100) as p:
results = p.map(is_available, hosts)
for host, available in zip(hosts, results):
print('{} is {}'.format(host, 'available' if available else 'not available'))