selectors
— Высокоуровневое мультиплексирование ввода/вывода¶
Added in version 3.4.
Источник: Lib/selectors.py
Введение¶
Этот модуль обеспечивает высокоуровневое и эффективное мультиплексирование ввода-вывода, построенное на примитивах модуля select
. Пользователям рекомендуется использовать этот модуль, если только они не хотят получить точный контроль над используемыми примитивами на уровне ОС.
Он определяет абстрактный базовый класс BaseSelector
, а также несколько конкретных реализаций (KqueueSelector
, EpollSelector
…), которые можно использовать для ожидания уведомления о готовности к вводу-выводу для нескольких файловых объектов. В дальнейшем под «файловым объектом» подразумевается любой объект с методом fileno()
или необработанный дескриптор файла. См. file object.
DefaultSelector
- это псевдоним наиболее эффективной реализации, доступной на текущей платформе: она должна быть выбрана по умолчанию для большинства пользователей.
Примечание
Тип поддерживаемых файловых объектов зависит от платформы: в Windows поддерживаются сокеты, но не pipes, в то время как в Unix поддерживаются оба типа (могут поддерживаться и некоторые другие типы, например fifos или специальные файловые устройства).
См.также
select
Модуль низкоуровневого мультиплексирования ввода/вывода.
Availability: не WASI.
Этот модуль не работает или недоступен на WebAssembly. Дополнительную информацию см. в разделе Платформы WebAssembly.
Занятия¶
Иерархия классов:
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 не зарегистрирован. Если fileobj недействителен (например, у него нет методаfileno()
или его методfileno()
имеет недопустимое возвращаемое значение), будет выдано сообщениеValueError
.
- 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()
.
Added in version 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)