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
сущность.
-
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)