Сценарий асинхронных запросов вылетает со слишком большим количеством URL - PullRequest
0 голосов
/ 18 февраля 2019

Я пытаюсь проверить набор URL для их кода состояния и вернуть все, которые имеют код 4xx или 5xx.В общей сложности мне нужно проверить около 12500 URL-адресов, и мой скрипт отлично работает до 7000 URL-адресов.Выше этого сценария происходит сбой при закрытой транспортной ошибке ResourceWarning.

Я использую python-3.6 и aiohttp 3.5.4

Любая идея, что вызывает это?

async def fetch(url, session):
    async with session.get(url) as response:
        data = response.status
        return url, data


async def bound_fetch(sem, url, session):
    async with sem:
        return await fetch(url, session)


async def check_urls(url_list):
    ''' get status code for all urls and write into dictionary '''

    base_url = <base_url>   
    tasks = []

    sem = asyncio.Semaphore(10)

    async with ClientSession() as session:
        for url in url_list:
            full_url = base_url + url
            task = asyncio.ensure_future(bound_fetch(sem, full_url.format(), session))
            tasks.append(task)

        results = await asyncio.gather(*tasks)
        results_dict = defaultdict(list)
        for res in results:
            if res[1] != 200 and res[1] != 301 and res[1] != 302:
                print(f'ERROR {str(res[1])} {res[0]}')
                results_dict[res[1]].append(res[0])

        print(f'URLs checked, found {str(len(results_dict))} errors')


''' main function'''
loop = asyncio.get_event_loop()
loop.set_debug(True)
warnings.simplefilter('always', ResourceWarning)
future = asyncio.ensure_future(check_urls(list_of_urls))
loop.run_until_complete(future)
...