Event loop регистрирует сетевые дескрипторы и ждёт уведомлений о готовности через механизм ОС. На Linux обычно используется epoll; kqueue относится к BSD/macOS, а не к Linux.
Какая связь между циклом событий asyncio и системными вызовами Linux, такими как epoll, select и kqueue? Каким образом операционная система сообщает Python-приложению, что данные из сетевого сокета готовы к чтению?
Event loop регистрирует сетевые дескрипторы и ждёт уведомлений о готовности через механизм ОС. На Linux обычно используется epoll; kqueue относится к BSD/macOS, а не к Linux.
Короткий ответ
Что ответить на собеседовании
Подробный разбор
Ответ с пояснениями
Event loop регистрирует сетевые дескрипторы и ждёт уведомлений о готовности через механизм ОС. На Linux обычно используется epoll; kqueue относится к BSD/macOS, а не к Linux.
Когда данные приходят, ядро отмечает сокет как доступный для чтения. Системный вызов ожидания возвращает готовые дескрипторы, loop выполняет соответствующие callbacks и возобновляет ожидающие coroutine. Готовность ещё не означает получение полного прикладного сообщения: чтение может вернуть часть данных или EOF. Конкретный механизм зависит от реализации loop и платформы; asyncio предоставляет высокоуровневую модель поверх него.