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 - это побитовая маска, указывающая, какие события ввода-вывода следует ожидать для данного файлового объекта. Это может быть комбинация констант модулей, приведенных ниже:
- 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)