Я пытаюсь получить код состояния из миллионов разных сайтов, я использую asyncio и aiohttp, я запускаю приведенный ниже код с другим количеством подключений (хотя тот же тайм-аут по запросу), но очень сильно отличается от результатов большее число следующих исключений.
'concurrent.futures._base.TimeoutError'
Код
import pandas as pd
import asyncio
import aiohttp
out = []
CONNECTIONS = 1000
TIMEOUT = 10
async def fetch(url, session, loop):
try:
async with session.get(url,timeout=TIMEOUT) as response:
res = response.status
out.append(res)
return res
except Exception as e:
_exception = 'Error: '+str(type(e))
out.append(_exception)
return _exception
async def bound_fetch(sem, url, session, loop):
async with sem:
await fetch(url, session, loop)
async def run(urls, loop):
tasks = []
sem = asyncio.Semaphore(value=CONNECTIONS,loop=loop)
_connector = aiohttp.TCPConnector(limit=CONNECTIONS, loop=loop)
async with aiohttp.ClientSession(connector=_connector,loop=loop) as session:
for url in urls:
task = asyncio.ensure_future(bound_fetch(sem, url, session, loop))
tasks.append(task)
responses = await asyncio.gather(*tasks,return_exceptions=True)
return responses
## BEGIN ##
tlds = open('data/sample_1k.txt').read().splitlines()
urls = ['http://{}'.format(x) for x in tlds[1:]]
loop = asyncio.get_event_loop()
future = asyncio.ensure_future(run(urls,loop))
ans = loop.run_until_complete(future)
print(str(pd.Series(out).value_counts()))
Результаты
СОЕДИНЕНИЯ = 1000
СОЕДИНЕНИЯ = 100
Это ошибка? Эти сайты реагируют с кодом состояния и запускаются последовательно или с более низкими соединениями, где нет ошибки таймаута, так почему это происходит? Другие исключения кажутся стабильными при изменении количества подключений. ClientOSErrors - это сайты, которые на самом деле тайм-аут или ответ, честно говоря, не знают, откуда происходят ошибки concurrent.futures._base.TimeoutError.