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

selectors.md

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

1> **Источник:** https://python-all.ru/3.12/library/selectors.html2>3> «Документация Python на русском» – неофициальный перевод официальной документации Python: версии от 2.6 до 3.16, полнотекстовый поиск, английский оригинал рядом с переводом. Эта Markdown-версия страницы предназначена для работы с LLM: вставьте её в ChatGPT, Claude или Cursor.45---67# `selectors` – высокоуровневое мультиплексирование ввода-вывода89Добавлено в версии 3.4.1011**Исходный код:** [Lib/selectors.py](https://python-all.ru/src/3.12/Lib/selectors.py)1213---1415## Введение1617Этот модуль обеспечивает высокоуровневое и эффективное мультиплексирование ввода-вывода, построенное на основе примитивов модуля [`select`](https://python-all.ru/3.12/library/select.html#module-select). Пользователям рекомендуется использовать этот модуль вместо него, если только не требуется точный контроль над используемыми примитивами уровня ОС.1819Он определяет абстрактный базовый класс [`BaseSelector`](https://python-all.ru/3.12/library/selectors.html#selectors.BaseSelector) вместе с несколькими конкретными реализациями ([`KqueueSelector`](https://python-all.ru/3.12/library/selectors.html#selectors.KqueueSelector), [`EpollSelector`](https://python-all.ru/3.12/library/selectors.html#selectors.EpollSelector)…), которые можно использовать для ожидания уведомлений о готовности ввода-вывода для нескольких файловых объектов. В дальнейшем под «файловым объектом» понимается любой объект с методом [`fileno()`](https://python-all.ru/3.12/library/io.html#io.IOBase.fileno) или файловый дескриптор. См. [файловый объект](https://python-all.ru/3.12/glossary.html#term-file-object).2021[`DefaultSelector`](https://python-all.ru/3.12/library/selectors.html#selectors.DefaultSelector) – это псевдоним для наиболее эффективной реализации, доступной на текущей платформе; для большинства пользователей его следует выбирать по умолчанию.2223> **Примечание**24>25> Тип поддерживаемых файловых объектов зависит от платформы: в Windows поддерживаются сокеты, но не каналы, тогда как в Unix поддерживаются и сокеты, и каналы (также могут поддерживаться и другие типы, например именованные каналы или специальные файловые устройства).2627> **См. также**28>29> **[`select`](https://python-all.ru/3.12/library/select.html#module-select)**30>31> Модуль низкоуровневого мультиплексирования ввода-вывода.3233[Доступность](https://python-all.ru/3.12/library/intro.html#availability): not Emscripten, not WASI.3435Этот модуль не работает или недоступен на платформах WebAssembly `wasm32-emscripten` и `wasm32-wasi`. См. [платформы WebAssembly](https://python-all.ru/3.12/library/intro.html#wasm-availability) для получения дополнительной информации.3637## Классы3839Иерархия классов:4041```python42BaseSelector43+-- SelectSelector44+-- PollSelector45+-- EpollSelector46+-- DevpollSelector47+-- KqueueSelector48```4950В следующих описаниях *events* – это битовая маска, указывающая, какие события ввода-вывода должны ожидаться для заданного файлового объекта. Она может быть комбинацией констант модуля, приведённых ниже:5152> | Константа | Значение |53> | --- | --- |54> | selectors.EVENT\_READ | Доступен для чтения |55> | selectors.EVENT\_WRITE | Доступен для записи |5657#### `class selectors.SelectorKey`5859Объект [`SelectorKey`](https://python-all.ru/3.12/library/selectors.html#selectors.SelectorKey) – это [`namedtuple`](https://python-all.ru/3.12/library/collections.html#collections.namedtuple), используемый для связывания файлового объекта с его нижележащим файловым дескриптором, выбранной маской событий и присоединенными данными. Он возвращается несколькими методами [`BaseSelector`](https://python-all.ru/3.12/library/selectors.html#selectors.BaseSelector).6061#### `fileobj`6263Зарегистрированный файловый объект.6465#### `fd`6667Нижележащий файловый дескриптор.6869#### `events`7071События, которые необходимо ожидать для этого файлового объекта.7273#### `data`7475Необязательные непрозрачные данные, связанные с этим файловым объектом: например, их можно использовать для хранения идентификатора сессии для каждого клиента.7677#### `class selectors.BaseSelector`7879Объект [`BaseSelector`](https://python-all.ru/3.12/library/selectors.html#selectors.BaseSelector) используется для ожидания готовности событий ввода-вывода на нескольких файловых объектах. Он поддерживает регистрацию и отмену регистрации файловых потоков, а также метод для ожидания событий ввода-вывода на этих потоках с необязательным тайм-аутом. Это абстрактный базовый класс, поэтому его нельзя инстанцировать. Используйте [`DefaultSelector`](https://python-all.ru/3.12/library/selectors.html#selectors.DefaultSelector) вместо него или один из [`SelectSelector`](https://python-all.ru/3.12/library/selectors.html#selectors.SelectSelector), [`KqueueSelector`](https://python-all.ru/3.12/library/selectors.html#selectors.KqueueSelector) и т.д., если нужна конкретная реализация и ваша платформа её поддерживает. [`BaseSelector`](https://python-all.ru/3.12/library/selectors.html#selectors.BaseSelector) и его конкретные реализации поддерживают протокол [менеджера контекста](https://python-all.ru/3.12/glossary.html#term-context-manager).8081#### `abstractmethod register(fileobj, events, data=None)`8283Регистрирует файловый объект для выбора, отслеживая события ввода-вывода.8485*fileobj* – файловый объект для мониторинга. Он может быть целочисленным файловым дескриптором или объектом с методом `fileno()`. *events* – побитовая маска событий для мониторинга. *data* – непрозрачный объект.8687Это возвращает новый экземпляр [`SelectorKey`](https://python-all.ru/3.12/library/selectors.html#selectors.SelectorKey) или возбуждает [`ValueError`](https://python-all.ru/3.12/library/exceptions.html#ValueError) в случае недопустимой маски событий или файлового дескриптора, или [`KeyError`](https://python-all.ru/3.12/library/exceptions.html#KeyError), если файловый объект уже зарегистрирован.8889#### `abstractmethod unregister(fileobj)`9091Отменяет регистрацию файлового объекта, удаляя его из отслеживания. Файловый объект должен быть отменён до закрытия.9293*fileobj* должен быть ранее зарегистрированным файловым объектом.9495Возвращает экземпляр [`SelectorKey`](https://python-all.ru/3.12/library/selectors.html#selectors.SelectorKey) или возбуждает [`KeyError`](https://python-all.ru/3.12/library/exceptions.html#KeyError), если *fileobj* не зарегистрирован. Возбуждает [`ValueError`](https://python-all.ru/3.12/library/exceptions.html#ValueError), если *fileobj* некорректен (например, у него нет метода `fileno()` или его метод `fileno()` возвращает недопустимое значение).9697#### `modify(fileobj, events, data=None)`9899Изменяет отслеживаемые события или присоединённые данные зарегистрированного файлового объекта.100101Это эквивалентно последовательному вызову `BaseSelector.unregister(fileobj)` и `BaseSelector.register(fileobj, events, data)`, за исключением того, что может быть реализовано более эффективно.102103Возвращает новый экземпляр [`SelectorKey`](https://python-all.ru/3.12/library/selectors.html#selectors.SelectorKey) или возбуждает [`ValueError`](https://python-all.ru/3.12/library/exceptions.html#ValueError) в случае недопустимой маски событий или файлового дескриптора, или [`KeyError`](https://python-all.ru/3.12/library/exceptions.html#KeyError), если файловый объект не зарегистрирован.104105#### `abstractmethod select(timeout=None)`106107Ожидает, пока некоторые зарегистрированные файловые объекты не станут готовы, или пока не истечёт тайм-аут.108109Если `timeout > 0`, задаёт максимальное время ожидания в секундах. Если `timeout <= 0`, вызов не будет блокироваться и сообщит о текущих готовых файловых объектах. Если *timeout* равен `None`, вызов будет блокироваться до тех пор, пока отслеживаемый файловый объект не станет готовым.110111Возвращает список кортежей `(key, events)`, по одному для каждого готового файлового объекта.112113*key* – это экземпляр [`SelectorKey`](https://python-all.ru/3.12/library/selectors.html#selectors.SelectorKey), соответствующий готовому файловому объекту. *events* – битовая маска событий, готовых на этом файловом объекте.114115> **Примечание**116>117> Этот метод может вернуть результат до того, как какой-либо файловый объект станет готовым или истечёт тайм-аут, если текущий процесс получает сигнал: в этом случае будет возвращён пустой список.118119Изменено в версии 3.5: Теперь при прерывании сигналом селектор повторяет попытку с пересчитанным тайм-аутом, если обработчик сигнала не возбудил исключение (см. [**PEP 475**](https://python-all.ru/3.12/library/selectors.html) для обоснования), вместо того чтобы возвращать пустой список событий до истечения тайм-аута.120121#### `close()`122123Закрывает селектор.124125Должен быть вызван, чтобы гарантировать освобождение всех базовых ресурсов. Селектор нельзя использовать после его закрытия.126127#### `get_key(fileobj)`128129Возвращает ключ, связанный с зарегистрированным файловым объектом.130131Возвращает экземпляр [`SelectorKey`](https://python-all.ru/3.12/library/selectors.html#selectors.SelectorKey), связанный с этим файловым объектом, или возбуждает [`KeyError`](https://python-all.ru/3.12/library/exceptions.html#KeyError), если файловый объект не зарегистрирован.132133#### `abstractmethod get_map()`134135Возвращает отображение файловых объектов на ключи селектора.136137Возвращает экземпляр [`Mapping`](https://python-all.ru/3.12/library/collections.abc.html#collections.abc.Mapping), отображающий зарегистрированные файловые объекты на соответствующие экземпляры [`SelectorKey`](https://python-all.ru/3.12/library/selectors.html#selectors.SelectorKey).138139#### `class selectors.DefaultSelector`140141Класс селектора по умолчанию, использующий наиболее эффективную реализацию, доступную на текущей платформе. Должен быть выбором по умолчанию для большинства пользователей.142143#### `class selectors.SelectSelector`144145селектор на основе [`select.select()`](https://python-all.ru/3.12/library/select.html#select.select).146147#### `class selectors.PollSelector`148149селектор на основе [`select.poll()`](https://python-all.ru/3.12/library/select.html#select.poll).150151#### `class selectors.EpollSelector`152153селектор на основе [`select.epoll()`](https://python-all.ru/3.12/library/select.html#select.epoll).154155#### `fileno()`156157Возвращает файловый дескриптор, используемый базовым объектом [`select.epoll()`](https://python-all.ru/3.12/library/select.html#select.epoll).158159#### `class selectors.DevpollSelector`160161селектор на основе [`select.devpoll()`](https://python-all.ru/3.12/library/select.html#select.devpoll).162163#### `fileno()`164165Возвращает файловый дескриптор, используемый базовым объектом [`select.devpoll()`](https://python-all.ru/3.12/library/select.html#select.devpoll).166167Добавлено в версии 3.5.168169#### `class selectors.KqueueSelector`170171селектор на основе [`select.kqueue()`](https://python-all.ru/3.12/library/select.html#select.kqueue).172173#### `fileno()`174175Возвращает файловый дескриптор, используемый базовым объектом [`select.kqueue()`](https://python-all.ru/3.12/library/select.html#select.kqueue).176177## Примеры178179Ниже приведена простая реализация эхо-сервера:180181```python182import selectors183import socket184185sel = selectors.DefaultSelector()186187def accept(sock, mask):188    conn, addr = sock.accept()  # Должен быть готов189    print('accepted', conn, 'from', addr)190    conn.setblocking(False)191    sel.register(conn, selectors.EVENT_READ, read)192193def read(conn, mask):194    data = conn.recv(1000)  # Должен быть готов195    if data:196        print('echoing', repr(data), 'to', conn)197        conn.send(data)  # Надеюсь, не заблокируется198    else:199        print('closing', conn)200        sel.unregister(conn)201        conn.close()202203sock = socket.socket()204sock.bind(('localhost', 1234))205sock.listen(100)206sock.setblocking(False)207sel.register(sock, selectors.EVENT_READ, accept)208209while True:210    events = sel.select()211    for key, mask in events:212        callback = key.data213        callback(key.fileobj, mask)214```215