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)