Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Ответы к экзу ВвИТ 2 сем 1 курс.docx
Скачиваний:
0
Добавлен:
17.06.2026
Размер:
7.37 Mб
Скачать

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

20) Что такое блокирующая операция и почему она может приводить к «зависанию» программы или сервера?

Блокирующая операция — операция, которая приостанавливает выполнение всей программы, пока не завершится. Это и приводит к «зависанию» программы или сервера. Примеры блокирующих операций: time.sleep(), синхронные запросы к сети, чтение/запись файлов, долгие вычисления. Это приводит к блокировке потока, программа не выполняет другие задачи, нет реакции пользователя.

21) Объясните различие между CPU-bound и I/O-bound задачами. Для каких задач асинхронность особенно полезна?

CPU-bound — задача, ограниченная вычисm лениями (процессором): сложные математические операции, машинное обучение, обработка изображений/видео, большие циклы и алгоритмы → процессор постоянно занят

I/O-bound — задача, ограниченная ожиданием ввода/вывода: запросы к API/интернету, работа с базой данных, чтение/запись файлов, ожидание ответа сервера → программа ждет, а не считает. Такая задача требует асинхронного программирования.

22) Что такое event loop, coroutine, async и await в Python? Как они связаны между собой?

Event loop — планировщик, который управляет выполнением асинхронных задач. Задачи: запуск задач, отслеживание, какие из задач в режиме ожидания, переключается между задачами, возвращает задачу к выполнению, когда они готовы.

Coroutine (корутина) — функция, которая может приостанавливать и продолжать выполнение.

Async — асинхронное выполнение функции

Await — оператор, который приостанавливает выполнение корутины и передает управление Event Loop.

Связь между ними можно представить как работу дирижера и музыкантов:

  1. Создание: Ключевое слово async создает партитуру (корутину) для музыканта.

  2. Оркестровка: Цикл событий (Event loop) — это дирижер. Он берет созданные корутины и начинает их исполнять по очереди.

  3. Пауза и переключение: Когда корутина доходит до операции, которая требует времени (например, await asyncio.sleep(1)), она не заставляет всю программу стоять на месте. Оператор await сигнализирует циклу событий: "Я занята ожиданием, переключись пока на другую задачу".

  4. Возобновление: Дирижер (Event loop) переключается на выполнение другой корутины. Как только долгое ожидание первой задачи заканчивается, цикл событий возвращает управление первой корутине с того места, где она остановилась.

23) Как asyncio.create_task() и asyncio.gather() помогают выполнять несколько задач конкурентно?

1. Как работает asyncio.create_task() (планирование задачи)

  • Планирует выполнение: Оборачивает корутину в объект Task и сразу ставит её в очередь планировщика событийного цикла (Event Loop).

  • Фоновый запуск: Функция возвращает управление основному коду, позволяя ему выполняться дальше, в то время как задача уже начинает исполняться.

  • Главная польза: Позволяет запустить несколько независимых операций практически одновременно, вместодовательного ожидания каждой из них.

2. Как работает asyncio.gather() (сбор результатов)

  • Группировка и ожидание: Принимает список корутин или уже созданных задач, а затем блокирует дальнейшее выполнение родительской корутины, пока все переданные задачи не завершатся.

  • Агрегация: Возвращает список результатов в том же порядке, в каком задачи были переданы в функцию.

  • Главная польза: Позволяет «дождаться» завершения всех фоновых процессов и забрать их данные в одной точке кода.

Функции asyncio.create_task() и asyncio.gather() работают в связке, запуская несколько корутин в фоновом режиме (конкурентно) и приостанавливая исполнение кода до тех пор, пока все операции не завершатся, что значительно сокращает общее время работы программы.

Код ниже запускает три задачи одновременно с помощью create_task и ожидает их через gather:

24) Для чего используется библиотека aiohttp? Почему асинхронные HTTP-запросы эффективны при работе с несколькими API?

aiohttp — библиотека для выполнения асинхронных HTTP-запросов в Python. Может отправлять HTTP-запросы (await session.get(url)), получать ответы от серверов в формате текста, JSON и бинарных данных (data = await response.json()), работать через async/await (представлено в прошлых примерах), позволяет делать много запросов одновременно

Асинхронные HTTP-запросы позволяют отправлять новые запросы, не дожидаясь ответа от предыдущих. Это кардинально экономит время и ресурсы, запуская выполнение всех сетевых операций параллельно