Dnspython: установка времени ожидания/срока жизни запроса

У меня есть небольшой скрипт, который проверяет большой список доменов на наличие их MX-записей, все работает нормально, но когда скрипт находит домен без записи, он довольно долго переходит к следующему.

Я попытался добавить:

query.lifetime = 1.0
or
query.timeout = 1.0

но это, кажется, ничего не делает. Кто-нибудь знает, как настраивается этот параметр?

Мой сценарий ниже, спасибо за ваше время.

import dns.resolver
from dns.exception import DNSException
import dns.query
import csv

domains = csv.reader(open('domains.csv', 'rU'))
output = open('output.txt', 'w')
for row in domains:
    try:
        domain = row[0]
        query = dns.resolver.query(domain,'MX')
        query.lifetime = 1.0
    except DNSException:
        print "nothing here"
    for rdata in query:
            print domain, " ", rdata.exchange, 'has preference', rdata.preference
            output.writelines(domain)
            output.writelines(",")
            output.writelines(rdata.exchange.to_text())
            output.writelines("\n")

person Christopher Long    schedule 24.01.2012    source источник


Ответы (1)


Вы устанавливаете время ожидания после выполнения запроса. Так это ничего не даст!

Вместо этого вы хотите создать объект Resolver, установить его тайм-аут, а затем вызвать его метод query(). dns.resolver.query() — это просто вспомогательная функция, которая создает экземпляр объекта Resolver по умолчанию и вызывает его метод query(), поэтому вам нужно сделать это вручную, если вы не хотите использовать Resolver по умолчанию.

resolver = dns.resolver.Resolver()
resolver.timeout = 1
resolver.lifetime = 1

Затем используйте это в своем цикле:

try:
    domain = row[0]
    query = resolver.query(domain,'MX')
except:
    # etc.

Вы должны иметь возможность использовать один и тот же объект Resolver для всех запросов.

person kindall    schedule 24.01.2012
comment
Да, я не совсем уверен, в чем разница (никогда не использовал эту библиотеку), но я рад, что вы нашли правильный атрибут. - person kindall; 24.01.2012
comment
Обратите внимание, что timeout — это только половина уравнения. Как и в исходном примере OP, также следует использовать lifetime. См. comments.gmane.org/gmane.comp.python.dnspython.user. /144 - person James S; 26.04.2014
comment
@JameS: ссылка мертва. [официальный документ|dnspython.org/docs/1.14 .0/dns.resolver.Resolver-class.html] Если время жизни истекает, возникает исключение Timeout. . Я проверил, и да, .lifetime было достаточно, чтобы отменить исключение поиска, чтобы поймать: dns.exception.Timeout - person Boop; 23.10.2018
comment
официальный документ. Мех, моя ссылка была уродливой. Через 5 минут не могу отредактировать, извините за спам. - person Boop; 23.10.2018
comment
Великолепно! Мне было трудно найти этот ответ, но это ответ! :) - person MaxSteel; 19.09.2019