selectors.md
1> **Источник:** https://python-all.ru/3.4/library/selectors.html2>3> «Документация Python на русском» – неофициальный перевод официальной документации Python: версии от 2.6 до 3.16, полнотекстовый поиск, английский оригинал рядом с переводом. Эта Markdown-версия страницы предназначена для работы с LLM: вставьте её в ChatGPT, Claude или Cursor.45---67# 18.4. [`selectors`](https://python-all.ru/3.4/library/selectors.html#module-selectors) – Высокоуровневая мультиплексация ввода-вывода89Новое в версии 3.4.1011## 18.4.1. Введение1213Этот модуль предоставляет высокоуровневую и эффективную мультиплексацию ввода-вывода, построенную на примитивах модуля [`select`](https://python-all.ru/3.4/library/select.html#module-select). Пользователям рекомендуется использовать именно этот модуль, если только они не хотят точного контроля над используемыми примитивами уровня ОС.1415В нём определяется абстрактный базовый класс [`BaseSelector`](https://python-all.ru/3.4/library/selectors.html#selectors.BaseSelector), а также несколько конкретных реализаций ([`KqueueSelector`](https://python-all.ru/3.4/library/selectors.html#selectors.KqueueSelector), [`EpollSelector`](https://python-all.ru/3.4/library/selectors.html#selectors.EpollSelector)...), которые можно использовать для ожидания уведомлений о готовности ввода-вывода для нескольких файловых объектов. В дальнейшем под «файловым объектом» понимается любой объект с методом `fileno()` или целочисленный файловый дескриптор. См. [*file object*](https://python-all.ru/3.4/glossary.html#term-file-object).1617[`DefaultSelector`](https://python-all.ru/3.4/library/selectors.html#selectors.DefaultSelector) – это псевдоним наиболее эффективной реализации, доступной на текущей платформе; это должен быть выбор по умолчанию для большинства пользователей.1819> **Примечание**20>21> Тип поддерживаемых файловых объектов зависит от платформы: в Windows поддерживаются сокеты, но не каналы, тогда как в Unix поддерживаются и сокеты, и каналы (также могут поддерживаться и другие типы, например именованные каналы или специальные файловые устройства).2223> **См. также**24>25> **[`select`](https://python-all.ru/3.4/library/select.html#module-select)**26>27> Модуль низкоуровневого мультиплексирования ввода-вывода.2829## 18.4.2. Классы3031Иерархия классов:3233```python34BaseSelector35+-- SelectSelector36+-- PollSelector37+-- EpollSelector38+-- KqueueSelector39```4041В дальнейшем *events* – это битовая маска, указывающая, какие события ввода-вывода следует ожидать для данного файлового объекта. Она может быть комбинацией следующих констант:4243> | Константа | Значение |44> | --- | --- |45> | `EVENT_READ` | Доступен для чтения |46> | `EVENT_WRITE` | Доступен для записи |4748#### `class selectors.SelectorKey`4950[`SelectorKey`](https://python-all.ru/3.4/library/selectors.html#selectors.SelectorKey) – это [`namedtuple`](https://python-all.ru/3.4/library/collections.html#collections.namedtuple), используемый для связи файлового объекта с его базовым файловым дескриптором, выбранной маской событий и прикреплёнными данными. Он возвращается несколькими методами [`BaseSelector`](https://python-all.ru/3.4/library/selectors.html#selectors.BaseSelector).5152#### `fileobj`5354Зарегистрированный файловый объект.5556#### `fd`5758Нижележащий файловый дескриптор.5960#### `events`6162События, которые необходимо ожидать для этого файлового объекта.6364#### `data`6566Необязательные непрозрачные данные, связанные с этим файловым объектом: например, их можно использовать для хранения идентификатора сессии для каждого клиента.6768#### `class selectors.BaseSelector`6970[`BaseSelector`](https://python-all.ru/3.4/library/selectors.html#selectors.BaseSelector) используется для ожидания готовности событий ввода-вывода на нескольких файловых объектах. Он поддерживает регистрацию и отмену регистрации файловых потоков, а также метод для ожидания событий ввода-вывода на этих потоках с необязательным тайм-аутом. Это абстрактный базовый класс, поэтому его нельзя инстанциировать. Используйте [`DefaultSelector`](https://python-all.ru/3.4/library/selectors.html#selectors.DefaultSelector) или один из [`SelectSelector`](https://python-all.ru/3.4/library/selectors.html#selectors.SelectSelector), [`KqueueSelector`](https://python-all.ru/3.4/library/selectors.html#selectors.KqueueSelector) и т. д., если вы хотите использовать конкретную реализацию, и ваша платформа её поддерживает. [`BaseSelector`](https://python-all.ru/3.4/library/selectors.html#selectors.BaseSelector) и его конкретные реализации поддерживают протокол [*менеджера контекста*](https://python-all.ru/3.4/glossary.html#term-context-manager).7172#### `register(fileobj, events, data=None)`7374Регистрирует файловый объект для выбора, отслеживая события ввода-вывода.7576*fileobj* – это файловый объект для наблюдения. Он может быть целочисленным файловым дескриптором или объектом с методом `fileno()`. *events* – битовая маска событий для наблюдения. *data* – непрозрачный объект.7778Возвращает новый экземпляр [`SelectorKey`](https://python-all.ru/3.4/library/selectors.html#selectors.SelectorKey) или вызывает [`ValueError`](https://python-all.ru/3.4/library/exceptions.html#ValueError) в случае недопустимой маски событий или файлового дескриптора, или [`KeyError`](https://python-all.ru/3.4/library/exceptions.html#KeyError), если файловый объект уже зарегистрирован.7980#### `unregister(fileobj)`8182Отменяет регистрацию файлового объекта, удаляя его из отслеживания. Файловый объект должен быть отменён до закрытия.8384*fileobj* должен быть ранее зарегистрированным файловым объектом.8586Возвращает соответствующий экземпляр [`SelectorKey`](https://python-all.ru/3.4/library/selectors.html#selectors.SelectorKey) или вызывает [`KeyError`](https://python-all.ru/3.4/library/exceptions.html#KeyError), если *fileobj* не зарегистрирован. Также вызовет [`ValueError`](https://python-all.ru/3.4/library/exceptions.html#ValueError), если *fileobj* недопустим (например, у него нет метода `fileno()` или его метод `fileno()` возвращает недопустимое значение).8788#### `modify(fileobj, events, data=None)`8990Изменяет отслеживаемые события или присоединённые данные зарегистрированного файлового объекта.9192Это эквивалентно вызову `BaseSelector.unregister(fileobj)()` с последующим `BaseSelector.register(fileobj, events, data)()`, за исключением того, что это может быть реализовано более эффективно.9394Возвращает новый экземпляр [`SelectorKey`](https://python-all.ru/3.4/library/selectors.html#selectors.SelectorKey) или вызывает [`ValueError`](https://python-all.ru/3.4/library/exceptions.html#ValueError) в случае недопустимой маски событий или файлового дескриптора, или [`KeyError`](https://python-all.ru/3.4/library/exceptions.html#KeyError), если файловый объект не зарегистрирован.9596#### `select(timeout=None)`9798Ожидает, пока некоторые зарегистрированные файловые объекты не станут готовы, или пока не истечёт тайм-аут.99100Если `timeout > 0`, это задаёт максимальное время ожидания в секундах. Если `timeout <= 0`, вызов не будет блокироваться и сообщит о текущих готовых файловых объектах. Если *timeout* равен `None`, вызов будет блокироваться, пока контролируемый файловый объект не станет готов.101102Возвращает список кортежей `(key, events)` по одному для каждого готового файлового объекта.103104*key* – это экземпляр [`SelectorKey`](https://python-all.ru/3.4/library/selectors.html#selectors.SelectorKey), соответствующий готовому файловому объекту. *events* – битовая маска событий, готовых на этом файловом объекте.105106> **Примечание**107>108> Этот метод может вернуть результат до того, как какой-либо файловый объект станет готовым или истечёт тайм-аут, если текущий процесс получает сигнал: в этом случае будет возвращён пустой список.109110#### `close()`111112Закрывает селектор.113114Должен быть вызван, чтобы гарантировать освобождение всех базовых ресурсов. Селектор нельзя использовать после его закрытия.115116#### `get_key(fileobj)`117118Возвращает ключ, связанный с зарегистрированным файловым объектом.119120Возвращает экземпляр [`SelectorKey`](https://python-all.ru/3.4/library/selectors.html#selectors.SelectorKey), связанный с этим файловым объектом, или вызывает [`KeyError`](https://python-all.ru/3.4/library/exceptions.html#KeyError), если файловый объект не зарегистрирован.121122#### `get_map()`123124Возвращает отображение файловых объектов на ключи селектора.125126Возвращает экземпляр [`Mapping`](https://python-all.ru/3.4/library/collections.abc.html#collections.abc.Mapping), который сопоставляет зарегистрированные файловые объекты с соответствующими экземплярами [`SelectorKey`](https://python-all.ru/3.4/library/selectors.html#selectors.SelectorKey) .127128#### `class selectors.DefaultSelector`129130Класс селектора по умолчанию, использующий наиболее эффективную реализацию, доступную на текущей платформе. Должен быть выбором по умолчанию для большинства пользователей.131132#### `class selectors.SelectSelector`133134Селектор на основе [`select.select()`](https://python-all.ru/3.4/library/select.html#select.select).135136#### `class selectors.PollSelector`137138Селектор на основе [`select.poll()`](https://python-all.ru/3.4/library/select.html#select.poll).139140#### `class selectors.EpollSelector`141142Селектор на основе [`select.epoll()`](https://python-all.ru/3.4/library/select.html#select.epoll).143144#### `fileno()`145146Возвращает файловый дескриптор, используемый нижележащим объектом [`select.epoll()`](https://python-all.ru/3.4/library/select.html#select.epoll).147148#### `class selectors.KqueueSelector`149150Селектор на основе [`select.kqueue()`](https://python-all.ru/3.4/library/select.html#select.kqueue).151152#### `fileno()`153154Возвращает файловый дескриптор, используемый нижележащим объектом [`select.kqueue()`](https://python-all.ru/3.4/library/select.html#select.kqueue).155156## 18.4.3. Примеры157158Ниже приведена простая реализация эхо-сервера:159160```python161import selectors162import socket163164sel = selectors.DefaultSelector()165166def accept(sock, mask):167 conn, addr = sock.accept() # Должен быть готов168 print('accepted', conn, 'from', addr)169 conn.setblocking(False)170 sel.register(conn, selectors.EVENT_READ, read)171172def read(conn, mask):173 data = conn.recv(1000) # Должен быть готов174 if data:175 print('echoing', repr(data), 'to', conn)176 conn.send(data) # Надеюсь, не заблокируется177 else:178 print('closing', conn)179 sel.unregister(conn)180 conn.close()181182sock = socket.socket()183sock.bind(('localhost', 1234))184sock.listen(100)185sock.setblocking(False)186sel.register(sock, selectors.EVENT_READ, accept)187188while True:189 events = sel.select()190 for key, mask in events:191 callback = key.data192 callback(key.fileobj, mask)193```194