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

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

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


Введение

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

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

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

Примечание

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

См.также

select

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

Занятия

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

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

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

Постоянная

Значение

EVENT_READ

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

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 не зарегистрирован. Если fileobj недопустим (например, у него нет метода ValueError или его метод 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, вызов не будет блокироваться и сообщит о готовых файловых объектах. Если timeout равен None, вызов будет блокироваться до тех пор, пока отслеживаемый файловый объект не станет готовым.

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

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

Примечание

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

Изменено в версии 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)
Вернуться на верх