148 вопросов по asyncio с технических собеседований
148 вопросов1634 компании353 технологии
Что проверяют на интервью
Как устроена подборка
На странице собраны вопросы по asyncio — от проверки базовых принципов до практического применения и архитектурных решений. В подборке чаще встречаются темы: asyncio, async, python.
threading запускает потоки в одном процессе, multiprocessing — отдельные процессы, asyncio — кооперативные задачи в event loop. Выбор зависит от CPU-нагрузки, I/O и используемых библиотек.
В показанном коде после долгого ожидания печатается 1, затем возникает NameError из-за неопределённого result. Порядок 1, 3, 2 получится только после исправления return.
После очень долгого ожидания будут напечатаны 1 и 3, затем возникнет TypeError: asyncio.sleep не принимает extra. Значение data — None; 2 не выводится.
Первой появится f2: её длинный цикл не содержит await и блокирует event loop. Даже если секунда сна f1 уже прошла, f1 не сможет продолжиться, пока f2 не отдаст управление.
При наличии import asyncio порядок будет 1, 3, 2. main-подобная run_all ждёт завершения coroutine_a, затем печатает 3 и только после этого запускает coroutine_b.
Порядок 1, 3, 2 возможен только после исправления return data или определения data. В показанном фрагменте data не определена: после первого ожидания печатается 1 и возникает NameError.
После долгого ожидания test_1 вернёт None и напечатает 1, затем main напечатает 3. test_2 получит None, но вызов sleep с extra вызовет TypeError: сообщения 2 не будет.
Coroutine можно ожидать напрямую через await, а для конкурентного выполнения — создать Task через asyncio.create_task(). Несколько связанных задач удобно запускать в TaskGroup или ожидать через gather().
create_task() планирует coroutine как отдельную Task; gather() совместно ожидает несколько awaitable и собирает результаты; wait() возвращает множества завершённых и незавершённых задач по заданному условию.
Event loop регистрирует сетевые дескрипторы и ждёт уведомлений о готовности через механизм ОС. На Linux обычно используется epoll; kqueue относится к BSD/macOS, а не к Linux.
Около 10 секунд плюс накладные расходы: два последовательных await asyncio.sleep(5) не перекрываются. Второе ожидание начинается только после завершения первого.