Я могу использовать ввода-вывода.ждать() в качестве контекстного менеджера?


Почему бы этому не сработать:

try:
    async with asyncio.wait_for(aiohttp.get(url), 2) as resp:
        print(resp.text())
except asyncio.TimeoutError as e:
    pass

Дает

async with asyncio.wait_for(aiohttp.get(url), 2) as resp:
AttributeError: __aexit__

В моем понимании, asyncio.wait_for() передал бы будущее aiohttp.get(), которое имеет __aenter__ и __aexit__ Метод (о чем свидетельствует тот факт, что async with aiohttp.get() работает).

1 2

1 ответ:

Вы не можете писать async with wait_for(...) -- wait_for не поддерживает асинхронный контекстный менеджер.

Я скоро добавлю Timeout класс к asyncio - смотрите https://groups.google.com/forum/#! тема/python-tulip / aRc3VBIXyRc разговор.

Сейчас вы можете попробовать aiohttp.Timeout (для этого требуется установить достаточно толстый пакет) -- или просто скопировать эти 40 строк кода.

Интересная вещь: подход не требует async with - достаточно просто старого доброго with.

UPD я пропустил это вы уже используете aiohttp. Таким образом, просто следуйте второму примеру из главы aiohttp timeouts.