2012-01-24 35 views
7

Tôi có một tập lệnh nhỏ kiểm tra danh sách tên miền lớn cho bản ghi MX của họ, mọi thứ hoạt động tốt nhưng khi tập lệnh tìm thấy tên miền không có bản ghi, sẽ mất khá nhiều thời gian để bỏ qua cai tiêp theo.Dnspython: Thiết lập thời gian chờ truy vấn/toàn thời gian

Tôi đã thử thêm:

query.lifetime = 1.0 
or 
query.timeout = 1.0 

nhưng điều này dường như không làm gì cả. Có ai biết cách thiết lập cấu hình này không?

Tập lệnh của tôi bên dưới, cảm ơn thời gian của bạn.

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") 

Trả lời

15

Bạn đang đặt thời gian chờ sau bạn đã thực hiện truy vấn. Vì vậy, đó sẽ không làm bất cứ điều gì!

Thay vào đó, bạn muốn tạo đối tượng Resolver, đặt thời gian chờ và sau đó gọi phương thức query(). dns.resolver.query() chỉ là một chức năng thuận tiện để khởi tạo đối tượng mặc định Resolver và gọi phương thức query() của nó, vì vậy bạn cần thực hiện điều đó theo cách thủ công nếu bạn không muốn mặc định Resolver.

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

Sau đó sử dụng này trong vòng lặp của bạn:

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

Bạn sẽ có thể sử dụng cùng một đối tượng Resolver cho tất cả các truy vấn.

+3

Cảm ơn bạn rất nhiều !, Tôi đã thử câu trả lời của bạn với thời gian chờ, nhưng vẫn có cùng một vấn đề, nhưng sử dụng resolver.lifetime = 1.0 đã hoạt động. –

+1

Vâng, tôi không thực sự chắc chắn sự khác biệt là gì (không bao giờ được sử dụng thư viện đó) nhưng tôi vui vì bạn đã tìm thấy thuộc tính phù hợp. – kindall

+0

Lưu ý rằng 'timeout' chỉ bằng một nửa của phương trình. Như trong ví dụ ban đầu của OP, 'lifetime' cũng nên được sử dụng. Xem http://comments.gmane.org/gmane.comp.python.dnspython.user/144 –

Các vấn đề liên quan