Документация Python неофициальный перевод

selectors.md

211 строк · 16.0 КБ · обычная страница · сырой текст · скачать

1> **Источник:** https://python-all.ru/3.5/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.5/library/selectors.html#module-selectors) – Мультиплексирование ввода-вывода высокого уровня89Новое в версии 3.4.1011**Исходный код:** [Lib/selectors.py](https://python-all.ru/src/3.5/Lib/selectors.py)1213---1415## 18.4.1. Введение1617Этот модуль обеспечивает высокоуровневое и эффективное мультиплексирование ввода-вывода, построенное на основе примитивов модуля [`select`](https://python-all.ru/3.5/library/select.html#module-select). Пользователям рекомендуется использовать этот модуль вместо него, если только не требуется точный контроль над используемыми примитивами уровня ОС.1819Он определяет абстрактный базовый класс [`BaseSelector`](https://python-all.ru/3.5/library/selectors.html#selectors.BaseSelector) вместе с несколькими конкретными реализациями ([`KqueueSelector`](https://python-all.ru/3.5/library/selectors.html#selectors.KqueueSelector), [`EpollSelector`](https://python-all.ru/3.5/library/selectors.html#selectors.EpollSelector)…), которые можно использовать для ожидания уведомлений о готовности ввода-вывода для нескольких файловых объектов. В дальнейшем под «файловым объектом» понимается любой объект с методом `fileno()` или файловый дескриптор. См. [файловый объект](https://python-all.ru/3.5/glossary.html#term-file-object).2021[`DefaultSelector`](https://python-all.ru/3.5/library/selectors.html#selectors.DefaultSelector) – это псевдоним для наиболее эффективной реализации, доступной на текущей платформе; для большинства пользователей его следует выбирать по умолчанию.2223> **Примечание**24>25> Тип поддерживаемых файловых объектов зависит от платформы: в Windows поддерживаются сокеты, но не каналы, тогда как в Unix поддерживаются и сокеты, и каналы (также могут поддерживаться и другие типы, например именованные каналы или специальные файловые устройства).2627> **См. также**28>29> **[`select`](https://python-all.ru/3.5/library/select.html#module-select)**30>31> Модуль низкоуровневого мультиплексирования ввода-вывода.3233## 18.4.2. Классы3435Иерархия классов:3637```python38BaseSelector39+-- SelectSelector40+-- PollSelector41+-- EpollSelector42+-- DevpollSelector43+-- KqueueSelector44```4546В следующих описаниях *events* – это битовая маска, указывающая, какие события ввода-вывода должны ожидаться для заданного файлового объекта. Она может быть комбинацией констант модуля, приведённых ниже:4748> | Константа | Значение |49> | --- | --- |50> | `EVENT_READ` | Доступен для чтения |51> | `EVENT_WRITE` | Доступен для записи |5253#### `class selectors.SelectorKey`5455Объект [`SelectorKey`](https://python-all.ru/3.5/library/selectors.html#selectors.SelectorKey) – это [`namedtuple`](https://python-all.ru/3.5/library/collections.html#collections.namedtuple), используемый для связывания файлового объекта с его нижележащим файловым дескриптором, выбранной маской событий и присоединенными данными. Он возвращается несколькими методами [`BaseSelector`](https://python-all.ru/3.5/library/selectors.html#selectors.BaseSelector).5657#### `fileobj`5859Зарегистрированный файловый объект.6061#### `fd`6263Нижележащий файловый дескриптор.6465#### `events`6667События, которые необходимо ожидать для этого файлового объекта.6869#### `data`7071Необязательные непрозрачные данные, связанные с этим файловым объектом: например, их можно использовать для хранения идентификатора сессии для каждого клиента.7273#### `class selectors.BaseSelector`7475Объект [`BaseSelector`](https://python-all.ru/3.5/library/selectors.html#selectors.BaseSelector) используется для ожидания готовности событий ввода-вывода на нескольких файловых объектах. Он поддерживает регистрацию и отмену регистрации файловых потоков, а также метод для ожидания событий ввода-вывода на этих потоках с необязательным тайм-аутом. Это абстрактный базовый класс, поэтому его нельзя инстанцировать. Используйте [`DefaultSelector`](https://python-all.ru/3.5/library/selectors.html#selectors.DefaultSelector) вместо него или один из [`SelectSelector`](https://python-all.ru/3.5/library/selectors.html#selectors.SelectSelector), [`KqueueSelector`](https://python-all.ru/3.5/library/selectors.html#selectors.KqueueSelector) и т.д., если нужна конкретная реализация и ваша платформа её поддерживает. [`BaseSelector`](https://python-all.ru/3.5/library/selectors.html#selectors.BaseSelector) и его конкретные реализации поддерживают протокол [менеджера контекста](https://python-all.ru/3.5/glossary.html#term-context-manager).7677#### `abstractmethod register(fileobj, events, data=None)`7879Регистрирует файловый объект для выбора, отслеживая события ввода-вывода.8081*fileobj* – файловый объект для мониторинга. Он может быть целочисленным файловым дескриптором или объектом с методом `fileno()`. *events* – побитовая маска событий для мониторинга. *data* – непрозрачный объект.8283Это возвращает новый экземпляр [`SelectorKey`](https://python-all.ru/3.5/library/selectors.html#selectors.SelectorKey) или возбуждает [`ValueError`](https://python-all.ru/3.5/library/exceptions.html#ValueError) в случае недопустимой маски событий или файлового дескриптора, или [`KeyError`](https://python-all.ru/3.5/library/exceptions.html#KeyError), если файловый объект уже зарегистрирован.8485#### `abstractmethod unregister(fileobj)`8687Отменяет регистрацию файлового объекта, удаляя его из отслеживания. Файловый объект должен быть отменён до закрытия.8889*fileobj* должен быть ранее зарегистрированным файловым объектом.9091Возвращает экземпляр [`SelectorKey`](https://python-all.ru/3.5/library/selectors.html#selectors.SelectorKey) или возбуждает [`KeyError`](https://python-all.ru/3.5/library/exceptions.html#KeyError), если *fileobj* не зарегистрирован. Возбуждает [`ValueError`](https://python-all.ru/3.5/library/exceptions.html#ValueError), если *fileobj* некорректен (например, у него нет метода `fileno()` или его метод `fileno()` возвращает недопустимое значение).9293#### `modify(fileobj, events, data=None)`9495Изменяет отслеживаемые события или присоединённые данные зарегистрированного файлового объекта.9697Это эквивалентно последовательному вызову `BaseSelector.unregister(fileobj)()` и `BaseSelector.register(fileobj, events, data)()`, за исключением того, что может быть реализовано более эффективно.9899Возвращает новый экземпляр [`SelectorKey`](https://python-all.ru/3.5/library/selectors.html#selectors.SelectorKey) или возбуждает [`ValueError`](https://python-all.ru/3.5/library/exceptions.html#ValueError) в случае недопустимой маски событий или файлового дескриптора, или [`KeyError`](https://python-all.ru/3.5/library/exceptions.html#KeyError), если файловый объект не зарегистрирован.100101#### `abstractmethod select(timeout=None)`102103Ожидает, пока некоторые зарегистрированные файловые объекты не станут готовы, или пока не истечёт тайм-аут.104105Если `timeout > 0`, задаёт максимальное время ожидания в секундах. Если `timeout <= 0`, вызов не будет блокироваться и сообщит о текущих готовых файловых объектах. Если *timeout* равен `None`, вызов будет блокироваться до тех пор, пока отслеживаемый файловый объект не станет готовым.106107Возвращает список кортежей `(key, events)`, по одному для каждого готового файлового объекта.108109*key* – это экземпляр [`SelectorKey`](https://python-all.ru/3.5/library/selectors.html#selectors.SelectorKey), соответствующий готовому файловому объекту. *events* – битовая маска событий, готовых на этом файловом объекте.110111> **Примечание**112>113> Этот метод может вернуть результат до того, как какой-либо файловый объект станет готовым или истечёт тайм-аут, если текущий процесс получает сигнал: в этом случае будет возвращён пустой список.114115Изменено в версии 3.5: Теперь при прерывании сигналом селектор повторяет попытку с пересчитанным тайм-аутом, если обработчик сигнала не возбудил исключение (см. [**PEP 475**](https://python-all.ru/3.5/library/selectors.html) для обоснования), вместо того чтобы возвращать пустой список событий до истечения тайм-аута.116117#### `close()`118119Закрывает селектор.120121Должен быть вызван, чтобы гарантировать освобождение всех базовых ресурсов. Селектор нельзя использовать после его закрытия.122123#### `get_key(fileobj)`124125Возвращает ключ, связанный с зарегистрированным файловым объектом.126127Возвращает экземпляр [`SelectorKey`](https://python-all.ru/3.5/library/selectors.html#selectors.SelectorKey), связанный с этим файловым объектом, или возбуждает [`KeyError`](https://python-all.ru/3.5/library/exceptions.html#KeyError), если файловый объект не зарегистрирован.128129#### `abstractmethod get_map()`130131Возвращает отображение файловых объектов на ключи селектора.132133Возвращает экземпляр [`Mapping`](https://python-all.ru/3.5/library/collections.abc.html#collections.abc.Mapping), отображающий зарегистрированные файловые объекты на соответствующие экземпляры [`SelectorKey`](https://python-all.ru/3.5/library/selectors.html#selectors.SelectorKey).134135#### `class selectors.DefaultSelector`136137Класс селектора по умолчанию, использующий наиболее эффективную реализацию, доступную на текущей платформе. Должен быть выбором по умолчанию для большинства пользователей.138139#### `class selectors.SelectSelector`140141селектор на основе [`select.select()`](https://python-all.ru/3.5/library/select.html#select.select).142143#### `class selectors.PollSelector`144145селектор на основе [`select.poll()`](https://python-all.ru/3.5/library/select.html#select.poll).146147#### `class selectors.EpollSelector`148149селектор на основе [`select.epoll()`](https://python-all.ru/3.5/library/select.html#select.epoll).150151#### `fileno()`152153Возвращает файловый дескриптор, используемый базовым объектом [`select.epoll()`](https://python-all.ru/3.5/library/select.html#select.epoll).154155#### `class selectors.DevpollSelector`156157селектор на основе [`select.devpoll()`](https://python-all.ru/3.5/library/select.html#select.devpoll).158159#### `fileno()`160161Возвращает файловый дескриптор, используемый базовым объектом [`select.devpoll()`](https://python-all.ru/3.5/library/select.html#select.devpoll).162163Новое в версии 3.5.164165#### `class selectors.KqueueSelector`166167селектор на основе [`select.kqueue()`](https://python-all.ru/3.5/library/select.html#select.kqueue).168169#### `fileno()`170171Возвращает файловый дескриптор, используемый базовым объектом [`select.kqueue()`](https://python-all.ru/3.5/library/select.html#select.kqueue).172173## 18.4.3. Примеры174175Ниже приведена простая реализация эхо-сервера:176177```python178import selectors179import socket180181sel = selectors.DefaultSelector()182183def accept(sock, mask):184    conn, addr = sock.accept()  # Должен быть готов185    print('accepted', conn, 'from', addr)186    conn.setblocking(False)187    sel.register(conn, selectors.EVENT_READ, read)188189def read(conn, mask):190    data = conn.recv(1000)  # Должен быть готов191    if data:192        print('echoing', repr(data), 'to', conn)193        conn.send(data)  # Надеюсь, не заблокируется194    else:195        print('closing', conn)196        sel.unregister(conn)197        conn.close()198199sock = socket.socket()200sock.bind(('localhost', 1234))201sock.listen(100)202sock.setblocking(False)203sel.register(sock, selectors.EVENT_READ, accept)204205while True:206    events = sel.select()207    for key, mask in events:208        callback = key.data209        callback(key.fileobj, mask)210```211