Как избежать зависания программы при подключении к серверу

У меня есть небольшой скрипт, который фильтрует те доменные имена, которые еще не зарегистрированы. Я использую модуль Pywhois. Проблема в том, что он внезапно зависает и ничего не делает после нескольких (иногда сотен) запросов. Я думаю, что это не запрет, потому что я могу запустить программу сразу после остановки, и она работает.

Я хотел бы избежать этого замораживания. Моя идея состоит в том, чтобы подсчитать время выполнения функции, и если время пересекает какую-то строку (например, 10 секунд), она повторяет код.

Есть ли у вас какие-либо советы, как избежать замерзания? Или лучший способ проверить домены?

Вот код:

for keyword in keywords:
        try:
            details = pythonwhois.get_whois(keyword+'.com')
        except Exception as e:
            print e
            continue
        if 'status' not in details.keys():
            print 'Free domain!'
            print keyword

2 ответа

Решение

Этот метод подвержен изменениям (если изменяется базовая библиотека), однако вы можете вызывать функции внутренних сокетов, чтобы установить время ожидания для всех сетевых вызовов pythonwhois. Например:

TIMEOUT = 5.0 # timeout in seconds
pythonwhois.net.socket.setdefaulttimeout(TIMEOUT)
pythonwhois.get_whois("example.com")

Может быть, вы могли бы попробовать dnspython. Похоже, вы просто хотите проверить, зарегистрировано ли доменное имя. Например:

import dns.resolver

for keyword in keywords:
    try:
        dns.resolver.query(keyword+'.com')
    except dns.resolver.NXDOMAIN:
        print(keyword+'.com is available!')

DNS-распознаватель имеет тайм-аут по умолчанию 2 секунды. Если вы хотите изменить это, вы можете сделать новый экземпляр dns.resolver.Resolver с другим timeout,

Чтобы сделать его многопоточным, пул потоков будет лучшим выбором, если вы сможете использовать python3:

from multiprocessing import Pool

def check_keyword(keyword):
    try:
        dns.resolver.query(keyword+'.com')
    except dns.resolver.NXDOMAIN:
        # You probably want to change this to a return
        print(keyword+'.com is available!') 

if __name__ == '__main__':
    keywords = [...]
    p = Pool(5)
    print(p.map(check_keyword, keywords))
Другие вопросы по тегам