Почему я должен использовать async при использовании модуля aiohttp? - PullRequest
0 голосов
/ 19 марта 2019

При написании асинхронных сканеров с использованием asyncio и aiohttp в Python у меня всегда возникал вопрос: почему вы должны использовать async with, и легко сообщать об ошибках, если вы их не используете.

Хотя aiohttp также имеет метод request, он может поддерживать вызов более простого API.Я хочу знать, в чем разница.Мне все еще очень нравится модуль requests, я не знаю, можно ли его использовать так же просто, как модуль requests.

1 Ответ

0 голосов
/ 19 марта 2019

почему вы должны использовать async with

Это не то, что вы должны использовать async with, это просто отказоустойчивое устройство для обеспечения того, чтобы ресурсыубирайсяВзяв классический пример из документации :

async def fetch(session, url):
    async with session.get(url) as response:
        return await response.text()

Вы можете переписать его как:

async def fetch(session, url):
    response = await session.get(url)
    return await response.text()

Эта версия работает так же, ноне закрывает объект ответа, поэтому некоторые ресурсы ОС (например, базовое соединение) могут продолжать удерживаться неопределенно долго.Более правильная версия будет выглядеть так:

async def fetch(session, url):
    response = await session.get(url)
    content = await response.text()
    response.close()
    return content

Эта версия по-прежнему не сможет закрыть ответ, если возникнет исключение при чтении текста.Это можно исправить с помощью finally - это именно то, что with и async with делают под капотом.С блоком async with код становится более устойчивым, поскольку язык гарантирует, что код очистки вызывается всякий раз, когда выполнение покидает блок.

...