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
.
-
abstractmethod
-
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)