Что выведет код 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 ошибок.