未完成のスレッドが多すぎるという問題があります。キューコマンド.join()は、キューを閉じるだけで、それを使用しているスレッドではないと思います。
私のスクリプトでは、280kドメインをチェックし、各ドメインについて彼のMXレコードのリストを取得し、サーバーのIPv6アドレスがある場合はそれを取得する必要があります。
私はスレッドを使用し、スクリプトのおかげで何倍も速くなりました。しかし、問題があります。キューにjoin()がありますが、新しいスレッドを作成できないことを通知するエラーが発生するまで、生きているスレッドの数が増えています(OSの制限?)。
データベースから新しいドメインを取得するときに、各Forループの後にスレッドを終了/閉じる/停止/リセットするにはどうすればよいですか?
スレッドクラスの定義...
class MX_getAAAA_thread(threading.Thread):
def __init__(self,queue,id_domain):
threading.Thread.__init__(self)
self.queue = queue
self.id_domain = id_domain
def run(self):
while True:
self.mx = self.queue.get()
res = dns.resolver.Resolver()
res.lifetime = 1.5
res.timeout = 0.5
try:
answers = res.query(self.mx,'AAAA')
ip_mx = str(answers[0])
except:
ip_mx = "N/A"
lock.acquire()
sql = "INSERT INTO mx (id_domain,mx,ip_mx) VALUES (" + str(id_domain) + ",'" + str(self.mx) + "','" + str(ip_mx) + "')"
try:
cursor.execute(sql)
db.commit()
except:
db.rollback()
print "MX" , '>>' , ip_mx, ' :: ', str(self.mx)
lock.release()
self.queue.task_done()
使用中のスレッドクラス...(メインのForループはここにはありません。これは彼の体の一部にすぎません)
try:
answers = resolver.query(domain, 'MX')
qMX = Queue.Queue()
for i in range(len(answers)):
t = MX_getAAAA_thread(qMX,id_domain)
t.setDaemon(True)
threads.append(t)
t.start()
for mx in answers:
qMX.put(mx.exchange)
qMX.join()
except NoAnswer as e:
print "MX - Error: No Answer"
except Timeout as etime:
print "MX - Error: dns.exception.Timeout"
print "end of script"
私がしようとしました:
for thread in threads:
thread.join()
キューが完了した後、queue.join()が実行されるとスレッドに対して何もすることがないため、待機する必要がないにもかかわらず、thread.join()は待機を停止しません。