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

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

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


Введение

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

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

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

Примечание

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

См.также

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

Классы

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

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

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

Константа Значение
EVENT_READ Доступно для чтения
EVENT_WRITE Доступно для записи
class selectors.SelectorKey

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

fileobj

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

fd

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

events

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

data

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

class selectors.BaseSelector

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

abstractmethod register(fileobj, events, data=None)

Зарегистрируйте объект файла для выбора, отслеживая его для событий I/O.

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, вызов не будет заблокирован и сообщит о готовых в данный момент объектах файла. Если 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)