Таймаут установления запроса aiohttp python
При отправке запроса только методом 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())
Источник: Stack Overflow на русском