Как избежать зависания программы при подключении к серверу
У меня есть небольшой скрипт, который фильтрует те доменные имена, которые еще не зарегистрированы. Я использую модуль 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))