почему вы должны использовать 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
код становится более устойчивым, поскольку язык гарантирует, что код очистки вызывается всякий раз, когда выполнение покидает блок.