148 вопросов по asyncio с технических собеседований
148 вопросов1634 компании353 технологии
Что проверяют на интервью
Как устроена подборка
На странице собраны вопросы по asyncio — от проверки базовых принципов до практического применения и архитектурных решений. В подборке чаще встречаются темы: asyncio, async, python.
Запустите оба ожидания конкурентно, например через asyncio.gather(). Два последовательных await asyncio.sleep(5) дают около 10 секунд, а конкурентный запуск — около 5 секунд плюс накладные расходы.
Один общий asyncio.Lock должен охватывать проверку и изменение состояния. Это защищает задачи одного event loop, но не несколько процессов, потоков или независимые экземпляры приложения.
Да, в показанном запуске asyncio.run() завершает асинхронные генераторы, поэтому Cleanup будет напечатано при завершении работы. Но break сам по себе не гарантирует немедленное выполнение finally генератора.
Назовите реальные async-функции и зачем они были нужны: параллельное ожидание HTTP, БД или других I/O. async def само по себе не ускоряет функцию и не запускает её автоматически.
Future представляет результат, который появится позже: значение, исключение или отмену. Task управляет выполнением coroutine и предоставляет Future-подобный интерфейс ожидания её результата.
asyncio event loop ожидает готовность I/O через платформенный механизм: на Linux это обычно epoll, а kqueue относится к BSD/macOS. Между ожиданиями loop выполняет готовые callbacks и продвигает tasks.
Наиболее надёжен последний вариант с учётом области состояния: атомарная операция Redis для нескольких workers либо asyncio.Lock для одного event loop. Проверка и уменьшение должны составлять одну критическую операцию.
Более зрелый вариант — атомарное условное списание в PostgreSQL с проверкой результата. Оно защищает общий баланс между процессами и экземплярами приложения, а не только внутри одного event loop.
В коде синхронный Redis блокирует async-обработчик, запросы к БД выполняются по одному ID, а отсутствие продукта приводит к ошибке. Нужны валидация входа, пакетное чтение и контролируемый кеш.
Для блокирующего I/O используйте ограниченный пул потоков, для async I/O — ограниченное число корутин с очередью или семафором. gather собирает результаты, но сам не ограничивает конкурентность.
Гонки возможны между участками, разделёнными await: другая задача успевает изменить общее состояние до продолжения первой. Один поток исключает одновременное исполнение, но не логическое чередование операций.