Предыстория проблемы (Не обязательно для основной проблемы):
Я разрабатываю веб-браузер для запроса 7500+. Я поместил URL-адреса в очередь. Если результат содержит ошибку для определенного URL, я возвращаю его в очередь. Это может быть ошибка сети (я использую бесплатный прокси в каждом запросе) или ошибка скрипта Lua. Итак, после того, как я закончу выполнять код для каждого URL-адреса 7500+, я вернусь к первому проблемному и так далее. Я хочу установить максимальное количество попыток равное 5, чтобы все происходило так же, как и раньше. Но если есть действительно проблемный, который остается ошибкой, цикл завершится через 5 раз.
Основная проблема:
Как реализовать очередь таким образом, чтобы она возвращала элемент в очередь в случае сбоя задачи для этого элемента и продолжала делать это в течение фиксированного числа раз. Если ошибка не устранена, она будет завершена.
Я написал следующий код, и пока он работал для небольшого количества ссылок. Но прежде чем запускать код для 7500 url, я должен быть уверен, что я не собираюсь застрять в бесконечном цикле.
def main(url_list):
final = list()
scraped_url_success = set()
to_scrape = Queue()
for url in url_list:
to_scrape.put(url)
while True:
try:
target_url = to_scrape.get(timeout = 5)
if target_url not in scraped_url_success:
result = get_result(target_url)
if 'error' in result.keys():
# This is where I am putting it back on the Queue
to_scrape.put(target_url)
else:
scraped_url_success.add(target_url)
final.append(result)
except Empty:
return (final)
except Exception as e:
print(e)
continue
Пока что моя единственная мысль - написать словарь, подобный следующему, и вести счет
def main(url_list):
counter = {} # NEW CODE
# other codes as same as before.
while True:
try:
target_url = to_scrape.get(timeout = 5)
if target_url not in scraped_url_success:
counter['target_url'] = 1
result = get_result(target_url)
if 'error' in result.keys():
if counter['target_url'] < 6:
to_scrape.put(target_url)
counter['target_url'] += 1
else:
continue
else:
# Next parts are same as before
Есть лучшее предложение? Эта моя идея выглядит слабой. Кроме того, мне действительно нужно иметь очередь здесь? В общем, если я не пишу многопоточный код, добавляет ли реализация очереди какое-либо значение (в контексте веб-очистки)?