Сельдерей: обработка исключений для глобальных таймаутов - PullRequest
0 голосов
/ 11 апреля 2019

Тайм-аут сельдерея убьет задания и не поместит их обратно в мою очередь на повторную загрузку. Есть ли способ отловить ошибки тайм-аута?

У меня есть веб-скребок, который делает много запросов. Если я отправляю запросы на 5 мм, я замечаю, что 100 000 из них могут быть отброшены из-за глобального тайм-аута.

Я передаю глобальный тайм-аут на 500 секунд на сельдерея с помощью celery worker -Ofair --concurrency=600 --without-gossip --time-limit=500 --pool=gevent -l critical.

@task(soft_time_limit=16, )
def urlopen(url):
    print('-open: {0}'.format(url))
    try:
        content, status_code, parsed_data = get_session(url)

        # Control flow for what we are going to do with the responses based on status code
        if status_code == 200:
            if len(parsed_data) > 0:
                for item in parsed_data:
                    add_url_es(item[1], item[2], item[0], url, es)
                add_200_urls_to_redis(url)
            elif parsed_data is None:
                add_urls_to_redis(url)
            else:
                print(status_code, parsed_data, url)
                add_failed_to_redis(url)

        elif status_code == 403:
            print(' this page has been denied due to {0} error for url {1}'.format(status_code, url))
            add_urls_to_redis(url)
        elif status_code == 404:
            print(' this page does not seem to exist due to {0} error for url {1}'.format(status_code, url))
            add_404_urls_to_redis(url)
        else:
            print('something is really wrong, error code {0}, url = {1}'.format(status_code, url))
            add_urls_to_redis(url)

    except SoftTimeLimitExceeded:
        print('time limit exceeded')
        add_urls_to_redis(url)
    except Exception as e:
        print('unaccounted for error {}'.format(e))
        add_urls_to_redis(url)

Я могу легко справиться с мягким таймаутом, но мне интересно, как поймать глобалы.

...