@Kirill-Gorelov
С ума с IT

Python aiohttp timeout?

Парни, как поставить таймоут на текущий url, а не на все.
Два кусочка кода.

async with session.get(url, headers=headers) as response:
            date = response.headers.get("DATE")


async with aiohttp.ClientSession() as session:
        for url in check_site:
            task = asyncio.ensure_future(bound_fetch(sem, url, session))
            tasks.append(task)
        responses = asyncio.gather(*tasks)
        await responses


Вот так, работает очень долго если много url, т.к. все сайты разные и отвечают с разным временем.
Если я ставлю timeout
async with session.get(url, timeout=30, headers=headers) as response:

то скрипт работает всего 30 секунд, а не на каждый адрес ставиться отдельный timeout.

То есть примеру даю на вход 1000 адресов, те что успели открыть за 30 секунд получаю ответ, а остальные, идут в исключение, т.к. не успел их проверить.
Точно такая же ситуация с read_timeout и conn_timeout.
  • Вопрос задан
  • 2783 просмотра
Решения вопроса 1
kshnkvn
@kshnkvn
yay ✌️ t.me/kshnkvn
sem = asyncio.Semaphore(100)
Объявите в корне файла, а не в функции и передавать его в качестве аргумента не нужно.
Не используйте большое кол-во тасков, ошибки могут быть из-за этого. И если все-же хотите попробовать, то установите ulimit -n 65535
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы