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)