Как сделать ограничение на выполнение команды в python
у меня есть программа которая пробегает по списку в exel и смотри существует сайт или нет. При тесте обнаружилось что некоторые сайты которые когда-то существовали могут очень долго грузится и секунд 20 ждать пока не вернёт ответ что сайт не отвечает.Мне нужно что б ожидание ответа небыло дольше 3 сек. Вот код:
import urllib.request
import openpyxl
import time
exit = False
wb = openpyxl.load_workbook('base.xlsx')
sheet = wb.active
n = (1)
while(exit == False):
Search = True
p = 'A' + str(n)
url = str("http://" + sheet[p].value)
url2 = str("https://" + sheet[p].value)
try:
urllib.request.urlopen(url)
print('Адррес существует')
except:
Search = False
if(Search == False):
try:
urllib.request.urlopen(url2)
print('Адррес существует')
except:
print ('Адреса не существует')
n += 1
print(sheet[p].value)
time.sleep(2)
Ответы (1 шт):
Автор решения: vadim vaduxa
→ Ссылка
import multiprocessing, urllib.request
class MPCheckUrl:
def __init__(self, timeout=3):
self.q_in = multiprocessing.Queue()
self.q_out = multiprocessing.Queue()
self.timeout = timeout
self.proc: 'multiprocessing.Process' = None
self.start()
return
def check_url(self, url):
self.q_in.put(url)
try: return self.q_out.get(timeout=self.timeout) # timeout 2
except:
self.stop() # остановить проверку, если urlopen завис
self.start()
return False
def stop(self): self.proc.terminate()
def start(self):
self.proc = multiprocessing.Process(target=self.run)
self.proc.daemon = True
self.proc.start()
def run(self):
while True:
url = self.q_in.get()
try: urllib.request.urlopen(url, timeout=self.timeout) # timeout 1
except: self.q_out.put(False)
else: self.q_out.put(True)
if __name__ == '__main__':
urls = [('http://url1', 'http://url2'), ('..', 'http://google.com'), ]
mp = MPCheckUrl()
print(['да' if any(map(mp.check_url, links)) else 'нет' for links in urls])
['нет', 'да']