Я использую gevent для загрузки некоторых html-страниц. Некоторые веб-сайты являются слишком медленными, некоторые перестают обслуживать запросы после определенного периода времени. Вот почему мне пришлось ограничить общее время для группы запросов, которые я делаю. Для этого я использую gevent «Timeout».Правильное завершение зеленой линии
timeout = Timeout(10)
timeout.start()
def downloadSite():
# code to download site's url one by one
url1 = downloadUrl()
url2 = downloadUrl()
url3 = downloadUrl()
try:
gevent.spawn(downloadSite).join()
except Timeout:
print 'Lost state here'
Но проблема в том, что я освобождаю все состояние, когда возникает пожар.
Представьте, что я сканирую сайт «www.test.com». Мне удалось загрузить 10 URL-адресов прямо до того, как администраторы сайта решили переключить веб-сервер для обслуживания. В таком случае я потеряю информацию об обходных страницах при возникновении исключения.
Вопрос в том, как сохранить состояние и обработать данные, даже если время ожидания произойдет?
Почему бы вам не задать один тайм-аут для каждого запроса? Что делает downloadUrl() на самом деле? Является ли это совместным блокированием? Можете ли вы предоставить самодостаточный пример? –
Код упрощен. Функция downloadSite() содержит код, чтобы получить первую страницу, найти хорошие внутренние ссылки, загрузить их, найти дополнительные ссылки и т. д. ... Я не представляю, как обернуть каждый запрос в отдельный тайм-аут. Imho это неправильно с точки зрения программирования +, это создало бы существенное влияние на веб-сайт (Представьте, что вы одновременно запрашиваете 100 веб-страниц с сайта www.test.com) – Termos