🐍 Python  ·  20 вопросов  ·  ~55 мин  ·  ⏱ Таймер 55:00  ·  Сложный  ·  👥 2 прошли

Асинхронное программирование

Разбирает coroutine, await, event loop, конкурентные задачи и отмену. Задания связывают корутины с темами «Цикл событий», «Конкурентный запуск» и «Отмена и ошибки»: придётся читать код, искать причину сбоя и выбирать решение по его поведению. Все задания рассчитаны на CPython 3.12; отличия других реализаций или версий учитываются только там, где это прямо оговорено.

Отвечено: 0 из 20
⏱ --:--
0%
💡 Инструкция: Версия: CPython 3.12. Выберите один ответ из четырёх. На 20 вопросов отведено не меньше 40 минут; код лучше читать построчно. После завершения вы увидите общий процент, четыре тематические шкалы и объяснение каждого ответа.
Вопрос 1 из 20
Что произойдёт после вызова асинхронной функции без await?
Python
async def load():
    print("start")
    return 5

coro = load()
print(type(coro).__name__)
Вопрос 2 из 20
Почему две задачи, созданные до ожидания результата, могут продвигаться конкурентно?
Вопрос 3 из 20
Что не так с этим кодом внутри async-функции?
Вопрос 4 из 20
Задачу отменяют во время работы с ресурсом. Какое исправление позволит выполнить очистку и при этом не скрыть отмену?
Вопрос 5 из 20
В каком порядке asyncio.gather вернёт результаты?
Python
import asyncio

async def load(name, delay):
    await asyncio.sleep(delay)
    return name

async def main():
    result = await asyncio.gather(
        load("slow", 0.03),
        load("fast", 0.01),
        load("mid", 0.02),
    )
    print(result)

asyncio.run(main())
Вопрос 6 из 20
Что произойдёт в TaskGroup, если одна дочерняя задача завершится необработанной ошибкой?
Python
import asyncio

async def first():
    await asyncio.sleep(0)
    raise ValueError("boom")

async def second():
    try:
        await asyncio.sleep(1)
    finally:
        print("second cancelled")

async def main():
    try:
        async with asyncio.TaskGroup() as tg:
            tg.create_task(first())
            tg.create_task(second())
    except* ValueError as group:
        print(type(group).__name__, len(group.exceptions))

asyncio.run(main())
Вопрос 7 из 20
Почему цикл с `await fetch(item)` внутри каждой итерации выполняет запросы последовательно?
Вопрос 8 из 20
Операция не успевает завершиться до границы `asyncio.timeout`. Что произойдёт при выходе из контекста?
Вопрос 9 из 20
Почему `async with` уместен для ресурса, вход и освобождение которого требуют ожидания?
Вопрос 10 из 20
Что требуется от объекта в `async for`?
Вопрос 11 из 20
В асинхронный сервис нужно встроить старую блокирующую функцию ввода-вывода, которую пока нельзя переписать. Какое проектное решение наименее разрушительно?
Вопрос 12 из 20
Что ограничивает `asyncio.Semaphore(10)` вокруг защищённой части?
Вопрос 13 из 20
Почему одна async-задача может надолго заморозить все остальные?
Вопрос 14 из 20
Почему созданную задачу важно дождаться или явно собрать её ошибку?
Вопрос 15 из 20
Что гарантирует shield, если внешний код отменяет ожидание?
Вопрос 16 из 20
Как очередь создаёт обратное давление?
Вопрос 17 из 20
Почему `asyncio.run()` нельзя бездумно вызывать из уже работающего асинхронного обработчика?
Вопрос 18 из 20
Что обычно делает `wait_for` при истечении времени, если ожидаемая операция не подавляет полученную отмену?
Вопрос 19 из 20
Как не потерять CancelledError в широком обработчике ошибок?
Вопрос 20 из 20
Как дождаться завершения потребления всех элементов очереди?

Ответьте на все 20 вопросов, чтобы получить результат

🔗 Встроить тест на свой сайт (iframe) ▼

Скопируйте код и вставьте в любое место на вашем сайте:

Также доступна прямая ссылка на embed-страницу