Этот вопрос проверяет понимание низкоуровневых механизмов асинхронного ввода-вывода в Python.
Модуль selectors — это высокоуровневая обёртка над системными механизмами ожидания событий. На Linux он использует epoll. Программист работает с единым API, не думая о деталях платформы. selectors позволяет отслеживать готовность сокетов и файлов к операциям. Это основа для event loop и асинхронности.
Асинхронность в Python строится поверх механизмов, которые предоставляет операционная система.
epoll — это Linux-механизм, который позволяет эффективно ждать события от большого количества файловых дескрипторов.
Он решает проблему:
не опрашивать сокеты по кругу
не блокировать поток
масштабироваться на тысячи соединений
Программе сообщают: «дескриптор готов к чтению или записи».
selectors — это стандартный Python-модуль, который предоставляет единый интерфейс для разных ОС.
Он:
автоматически выбирает лучший механизм (epoll, kqueue, poll)
скрывает системные различия
работает с файловыми дескрипторами и сокетами
Пример использования:
import selectors
import socket
sel = selectors.DefaultSelector()
sock = socket.socket()
sock.setblocking(False)
sel.register(sock, selectors.EVENT_READ)
events = sel.select(timeout=1)
# здесь можно обработать готовые сокеты
На Linux DefaultSelector внутри создаёт epoll.
Когда вызывается select():
управление передаётся ядру
поток «засыпает»
ядро будит его, когда появляется событие
selectors — это удобная абстракция над epoll и похожими механизмами. Он позволяет писать переносимый асинхронный код, не завися от конкретной ОС.