Возврат в очередь с максимальным ограничением повторных попыток в Python - PullRequest
0 голосов
/ 25 января 2019

Предыстория проблемы (Не обязательно для основной проблемы):

Я разрабатываю веб-браузер для запроса 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

Есть лучшее предложение? Эта моя идея выглядит слабой. Кроме того, мне действительно нужно иметь очередь здесь? В общем, если я не пишу многопоточный код, добавляет ли реализация очереди какое-либо значение (в контексте веб-очистки)?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...