Таймаут установления запроса aiohttp python

Рейтинг: 0Ответов: 0Опубликовано: 25.05.2023

При отправке запроса только методом iohttp.ClientSession.get или обернутым в asyncio.as_completed или asyncio.gather к недоступному или очень медленному серверу (устройства работающие через gprs) или запрашиваемый порт сервером не прослушивается, спустя 21 секунду после запуска скрипта:

  • на linux в ответ приходит не ошибка о недоступности узла, а код ответа "403";
  • на windows вызывается ошибка -aiohttp.client_exceptions.ClientConnectorError: Cannot connect to host 10.192.1.3:80 ssl:default [Превышен таймаут семафора].

Пробовал менять timeout ничего не изменилось.

Только начал изучать asyncio и появился вопрос: это нормальная работа библиотеки или как то можно настроить работу чтоб было понятно это ошибка сервера, сервер отверг подключение так как порт не поднят или сервер не доступен.

Скрипт запускаю на:

  • Python 3.11;
  • aiohttp 3.8.4;
  • Windows 10;
  • контейнер python:3.11-slim.

Пример из документации:

import aiohttp
import asyncio

async def main():

    timeout = aiohttp.ClientTimeout(total=60*5, connect=60, sock_connect=60, sock_read=60)
    async with aiohttp.ClientSession(timeout=timeout) as session:
        async with session.get('http://10.192.1.3') as response:

            print("Status:", response.status)            

loop = asyncio.get_event_loop()
loop.run_until_complete(main())

Пример мой:

import asyncio
import aiohttp
from aiohttp import ClientSession, ClientConnectorError, ClientConnectorCertificateError


async def fetch_status(session: ClientSession,
                       url: str,
                       delay: int = 0):
    await asyncio.sleep(delay)
    try:
        async with session.get(url, ssl=False) as result:
            try:
                html = await result.text()                
            except:
                html = result.status            
            
            response = [result.host, result.status, html]
            return response
            
    except ClientConnectorCertificateError as ssl:
        return (f'ssl - {url}: {ssl.args}')
    except ClientConnectorError as ce:
        return (f'ce - {url}: {ce.args}')
    except Exception as ex:
        return (f'ex - {url}: {ex.args}')


async def main():

    urls = []
    with open('common_urls.txt') as common_urls:
        urls = [url.replace('\n', '') for url in common_urls]       

    timeout = aiohttp.ClientTimeout(total=60, connect=25, sock_connect=25, sock_read=30)
    async with aiohttp.ClientSession(timeout=timeout) as session:

        fetchers = [fetch_status(session, 'http://' + url) for url in urls]

        count = 0
        for finished_task in asyncio.as_completed(fetchers):
            print(f'{count}: {await finished_task}')
            count += 1

asyncio.run(main())

Ответы

Ответов пока нет.