Что выведет код Middle asyncio обновлено

asyncio.timeout и отмена

Вопрос

Что выведет код? По строке на каждый print.

import asyncio

async def slow():
    try:
        await asyncio.sleep(10)
    except asyncio.CancelledError:
        print('cleanup')
        raise

async def main():
    try:
        async with asyncio.timeout(0.05):
            await slow()
    except TimeoutError:
        print('timeout')

asyncio.run(main())

Попробуйте сами

Напишите, что выведет код: каждый вывод с новой строки.

Показать ответ и разбор

Коротко

Код выведет: cleanup, timeout. Когда срок истекает, asyncio.timeout отменяет текущую задачу: внутри slow в точке await бросается CancelledError, код очистки печатает cleanup и пробрасывает отмену.

Что выведет

cleanup
timeout

Разбор

Когда срок истекает, asyncio.timeout отменяет текущую задачу: внутри slow в точке await бросается CancelledError, код очистки печатает cleanup и пробрасывает отмену. Контекстный менеджер превращает её в TimeoutError, который ловит внешний try.

Ответьте сами, а не прочитайте

В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.