selectors — Высокоуровневое мультиплексирование ввода-вывода

Добавлено в версии 3.4.

Исходный код: Lib/selectors.py


Вступление

Этот модуль обеспечивает высокоуровневое и эффективное мультиплексирование ввода-вывода, основанное на примитивах модуля select. Пользователям рекомендуется использовать этот модуль, если они не хотят точно контролировать используемые примитивы на уровне операционной системы.

Он определяет абстрактный базовый класс BaseSelector, а также несколько конкретных реализаций (KqueueSelector, EpollSelector…),, которые можно использовать для ожидания уведомления о готовности ввода-вывода для нескольких файловых объектов. В дальнейшем «файловый объект» относится к любому объекту с методом fileno() или необработанным файловым дескриптором. Смотрите file object.

DefaultSelector - это псевдоним наиболее эффективной реализации, доступной на текущей платформе: это должно быть выбором по умолчанию для большинства пользователей.

Примечание

Тип поддерживаемых файловых объектов зависит от платформы: в Windows поддерживаются сокеты, но не каналы, в то время как в Unix поддерживаются оба типа (также могут поддерживаться некоторые другие типы, такие как fifos или специальные файловые устройства).

См.также

select

Модуль низкоуровневого мультиплексирования ввода-вывода.

Availability: это не Emscripten, это был не я.

Этот модуль не работает или недоступен на платформах WebAssembly wasm32-emscripten и wasm32-wasi. Дополнительную информацию смотрите в разделе Платформы веб-сборки.

Занятия

Иерархия классов:

BaseSelector
+-- SelectSelector
+-- PollSelector
+-- EpollSelector
+-- DevpollSelector
+-- KqueueSelector

В дальнейшем events - это побитовая маска, указывающая, какие события ввода-вывода следует ожидать для данного файлового объекта. Это может быть комбинация констант модулей, приведенных ниже:

Постоянный

Значение

selectors.EVENT_READ

Доступно для чтения

selectors.EVENT_WRITE

Доступно для записи

class selectors.SelectorKey

SelectorKey - это namedtuple, используемый для привязки файлового объекта к его базовому файловому дескриптору, выбранной маске события и присоединенным данным. Он возвращается несколькими BaseSelector методами.

fileobj

Файловый объект зарегистрирован.

fd

Базовый файловый дескриптор.

events

События, которых необходимо ожидать в этом файловом объекте.

data

Необязательные непрозрачные данные, связанные с этим файловым объектом: например, их можно использовать для хранения идентификатора сеанса для каждого клиента.

class selectors.BaseSelector

Параметр BaseSelector используется для ожидания готовности к событию ввода-вывода для нескольких файловых объектов. Он поддерживает регистрацию и отмену регистрации в файловом потоке и метод ожидания событий ввода-вывода в этих потоках с дополнительным таймаутом. Это абстрактный базовый класс, поэтому его нельзя создать. Вместо этого используйте DefaultSelector или один из SelectSelector, KqueueSelector и т.д. если вы хотите конкретно использовать реализацию, и ваша платформа поддерживает ее. BaseSelector и ее конкретные реализации поддерживают протокол context manager.

abstractmethod register(fileobj, events, data=None)

Зарегистрируйте файловый объект для выбора, отслеживая его на предмет событий ввода-вывода.

fileobj - это файловый объект для мониторинга. Это может быть либо целочисленный файловый дескриптор, либо объект с методом fileno(). events - это побитовая маска событий для мониторинга. data - непрозрачный объект.

Это возвращает новый SelectorKey экземпляр или вызывает ValueError в случае неверной маски события или файлового дескриптора, или KeyError, если файловый объект уже зарегистрирован.

abstractmethod unregister(fileobj)

Снимите регистрацию файлового объекта с выбора, удалив его из мониторинга. Файловый объект должен быть снят с регистрации перед закрытием.

fileobj должен быть ранее зарегистрированным файловым объектом.

Это возвращает связанный экземпляр SelectorKey или вызывает KeyError, если fileobj не зарегистрирован. Он вызовет ValueError, если значение fileobj недопустимо (например, у него нет метода fileno() или его метод fileno() имеет недопустимое возвращаемое значение).

modify(fileobj, events, data=None)

Измените отслеживаемые события зарегистрированного файлового объекта или прикрепленные к нему данные.

Это эквивалентно BaseSelector.unregister(fileobj), за которым следует BaseSelector.register(fileobj, events, data), за исключением того, что оно может быть реализовано более эффективно.

Это возвращает новый SelectorKey экземпляр или вызывает ValueError в случае неверной маски события или файлового дескриптора, или KeyError, если файловый объект не зарегистрирован.

abstractmethod select(timeout=None)

Подождите, пока не будут готовы некоторые зарегистрированные файловые объекты или не истечет время ожидания.

Если timeout > 0, то указывается максимальное время ожидания в секундах. Если timeout <= 0, то вызов не будет заблокирован и сообщит о готовности файловых объектов в данный момент. Если тайм-аут равен None, вызов будет заблокирован до тех пор, пока не будет готов отслеживаемый файловый объект.

Это возвращает список (key, events) кортежей, по одному для каждого готового файлового объекта.

ключ - это экземпляр SelectorKey, соответствующий готовому файловому объекту. события - это битовая маска событий, готовых для этого файлового объекта.

Примечание

Этот метод может вернуться до того, как какой-либо файловый объект станет готовым или истечет тайм-аут, если текущий процесс получит сигнал: в этом случае будет возвращен пустой список.

Изменено в версии 3.5: Селектор теперь выполняется повторно с пересчитанным временем ожидания при прерывании сигналом, если обработчик сигнала не вызвал исключение (см. PEP 475 для объяснения), вместо того, чтобы возвращать пустой список событий до истечения времени ожидания.

close()

Закройте переключатель.

Это необходимо для того, чтобы убедиться, что какой-либо базовый ресурс освобожден. Селектор не должен использоваться после его закрытия.

get_key(fileobj)

Возвращает ключ, связанный с зарегистрированным файловым объектом.

Это возвращает SelectorKey экземпляр, связанный с этим файловым объектом, или вызывает KeyError, если файловый объект не зарегистрирован.

abstractmethod get_map()

Возвращает соответствие файловых объектов клавишам выбора.

Это возвращает экземпляр Mapping, сопоставляющий зарегистрированные файловые объекты с их связанным экземпляром SelectorKey.

class selectors.DefaultSelector

Класс выбора по умолчанию, использующий наиболее эффективную реализацию, доступную на текущей платформе. Это должно быть выбором по умолчанию для большинства пользователей.

class selectors.SelectSelector

select.select()-селектор на основе.

class selectors.PollSelector

select.poll()-селектор на основе.

class selectors.EpollSelector

select.epoll()-селектор на основе.

fileno()

Это возвращает файловый дескриптор, используемый базовым объектом select.epoll().

class selectors.DevpollSelector

select.devpoll()-селектор на основе.

fileno()

Это возвращает файловый дескриптор, используемый базовым объектом select.devpoll().

Добавлено в версии 3.5.

class selectors.KqueueSelector

select.kqueue()-селектор на основе.

fileno()

Это возвращает файловый дескриптор, используемый базовым объектом select.kqueue().

Примеры

Вот простая реализация эхо-сервера:

import selectors
import socket

sel = selectors.DefaultSelector()

def accept(sock, mask):
    conn, addr = sock.accept()  # Should be ready
    print('accepted', conn, 'from', addr)
    conn.setblocking(False)
    sel.register(conn, selectors.EVENT_READ, read)

def read(conn, mask):
    data = conn.recv(1000)  # Should be ready
    if data:
        print('echoing', repr(data), 'to', conn)
        conn.send(data)  # Hope it won't block
    else:
        print('closing', conn)
        sel.unregister(conn)
        conn.close()

sock = socket.socket()
sock.bind(('localhost', 1234))
sock.listen(100)
sock.setblocking(False)
sel.register(sock, selectors.EVENT_READ, accept)

while True:
    events = sel.select()
    for key, mask in events:
        callback = key.data
        callback(key.fileobj, mask)
Вернуться на верх