Q:

В 9 случаях из 10 получаю aiohttp.errors.ServerDisconnectedError

При отправке некоторого количества запросов к api кодом ниже в 9 случаях из 10 падает с exception aiohttp.errors.ServerDisconnectedError:
async def procesed(urls):
    response = await fetch_all(urls)
    return response

async def fetch_all(urls):
    responses = asyncio.gather(*[asyncio.ensure_future(fetch(url)) for url in urls])
    return await responses

async def fetch(url):
    async with aiohttp.ClientSession(headers=HEADERS).get(url) as response:
    if response.status != 200:
        response.raise_for_status()
    data = await response.json()
    response.close()
    return {
        'key': data['key'],
        'summary': data['summary'],
        'description': data['description']
    }

def create_table():
    table_data = list()
    loop = asyncio.get_event_loop()
    raw_table_data = loop.run_until_complete(procesed(urls))

НО... Если я запускаю этот же код из virtualenv, то никаких проблем нет. Это происходит не только на одной системе. Проверены Win 10, MacOS 14.6.2 и Ubuntu 16.04. Куда копать?

A:

async def fetch(url):
async with aiohttp.ClientSession(headers=HEADERS).get(url) as response:
if response.status != 200:
    response.raise_for_status()
data = await response.json()
response.close()
return {
    'key': data['key'],
    'summary': data['summary'],
    'description': data['description']
}

Вот тут не понятное инстанцирование новой сессии на каждый запрос, скорее всего из-за venv GC успевает подчищать не нужные более сессии, в отличии от обычного запуска.
Советую передавать ClientSession() в функцию как параметр. Это идиоматически и логичски верно, в отличие от текущего варианта.

