Содержание страницы
16.1. select – ожидание завершения ввода-вывода¶select – Waiting for I/O completion
Этот модуль предоставляет доступ к функциям select() и poll(),
доступным в большинстве операционных систем; epoll() доступен на Linux 2.5+ и
kqueue() доступен на большинстве BSD.
Обратите внимание: в Windows он работает только с сокетами; в других операционных системах
он также работает с другими типами файлов (в частности, в Unix – с каналами).
Его нельзя использовать с обычными файлами для определения, увеличился ли файл с момента
последнего чтения.
Модуль определяет следующее:
-
exception
select.error¶ Исключение, возбуждаемое при возникновении ошибки. Сопутствующее значение представляет собой пару, содержащую числовой код ошибки из
errnoи соответствующую строку, как она выводится функцией Cperror().
-
select.epoll([sizehint=-1])¶ (Поддерживается только на Linux 2.5.44 и новее.) Возвращает объект edge-опроса, который можно использовать как интерфейс с триггерами по фронту или по уровню для событий ввода/вывода; см. раздел Объекты опроса с триггерами по фронту и уровню (epoll) ниже, где перечислены методы, поддерживаемые объектами epoll.
Новое в версии 2.6.
-
select.poll()¶ Поддерживается не всеми операционными системами. Возвращает объект опроса, который поддерживает регистрацию и отмену регистрации файловых дескрипторов, а затем опрос их на предмет событий ввода-вывода; см. раздел Polling Objects ниже для методов, поддерживаемых объектами опроса.
-
select.kqueue()¶ Поддерживается только на BSD. Возвращает объект очереди ядра; см. раздел Kqueue Objects ниже для методов, поддерживаемых объектами kqueue.
Новое в версии 2.6.
-
select.kevent(ident, filter=KQ_FILTER_READ, flags=KQ_EV_ADD, fflags=0, data=0, udata=0)¶ Поддерживается только на BSD. Возвращает объект события ядра; см. раздел Kevent Objects ниже для методов, поддерживаемых объектами kevent.
Новое в версии 2.6.
-
select.select(rlist, wlist, xlist[, timeout])¶ Это простой интерфейс к системному вызову
select()Unix. Первые три аргумента – последовательности «ожидаемых объектов»: целые числа, представляющие файловые дескрипторы, или объекты с методом без параметровfileno(), возвращающим такое целое число:rlist: ожидать готовности к чтению
wlist: ожидать готовности к записи
xlist: ожидать «исключительного условия» (см. справочную страницу для того, что ваша система считает таким условием)
Пустые последовательности допускаются, но поддержка трёх пустых последовательностей зависит от платформы. (Известно, что это работает в Unix, но не в Windows.) Необязательный аргумент timeout задаёт тайм-аут в секундах как число с плавающей запятой. Если аргумент timeout опущен, функция блокируется, пока хотя бы один файловый дескриптор не будет готов. Нулевой тайм-аут соответствует опросу, без блокировки.
Возвращаемое значение – тройка списков готовых объектов: подмножества первых трех аргументов. Когда тайм-аут истекает без готовности файлового дескриптора, возвращаются три пустых списка.
Среди допустимых типов объектов в последовательностях – файловые объекты Python (например,
sys.stdin, или объекты, возвращаемыеopen()илиos.popen()), сокетные объекты, возвращаемыеsocket.socket(). Вы также можете сами определить класс-обёртку, при условии, что он имеет соответствующий методfileno()(который действительно возвращает файловый дескриптор, а не просто случайное целое число).Примечание
Файловые объекты в Windows недопустимы, но сокеты – да. В Windows базовая функция
select()предоставляется библиотекой WinSock и не обрабатывает файловые дескрипторы, не происходящие из WinSock.
-
select.PIPE_BUF¶ Файлы, которые считаются готовыми к записи функциями
select(),poll()или подобными интерфейсами в этом модуле, гарантированно не блокируются при записи доPIPE_BUFбайт. Это значение гарантируется POSIX как минимум 512. Доступность: Unix.Новое в версии 2.7.
16.1.1. Объекты epoll (опроса с фронтальным и уровнем сигналом)¶Edge and Level Trigger Polling (epoll) Objects
http://linux.die.net/man/4/epoll
eventmask
Константа
Значение
EPOLLINДоступен для чтения
EPOLLOUTДоступен для записи
EPOLLPRIСрочные данные для чтения
EPOLLERRВозникла ошибка на ассоциированном файловом дескрипторе
EPOLLHUPПроизошёл разрыв соединения на ассоциированном файловом дескрипторе
EPOLLETУстановить триггер по фронту (Edge Trigger), по умолчанию – триггер по уровню (Level Trigger)
EPOLLONESHOTУстановить одноразовое поведение. После извлечения одного события файловый дескриптор внутренне отключается.
EPOLLRDNORMЭквивалентно
EPOLLIN
EPOLLRDBANDПолоса приоритетных данных доступна для чтения.
EPOLLWRNORMЭквивалентно
EPOLLOUT
EPOLLWRBANDПриоритетные данные могут быть записаны.
EPOLLMSGИгнорируется.
-
epoll.close()¶ Закрывает управляющий файловый дескриптор объекта epoll.
-
epoll.fileno()¶ Возвращает номер файлового дескриптора управляющего fd.
-
epoll.fromfd(fd)¶ Создает объект epoll из заданного файлового дескриптора.
-
epoll.register(fd[, eventmask])¶ Регистрирует файловый дескриптор в объекте epoll.
Примечание
Регистрация уже зарегистрированного файлового дескриптора вызывает исключение IOError – в отличие от метода register у Объектов опроса.
-
epoll.modify(fd, eventmask)¶ Изменяет зарегистрированный файловый дескриптор.
-
epoll.unregister(fd)¶ Удаляет зарегистрированный файловый дескриптор из объекта epoll.
-
epoll.poll([timeout=-1[, maxevents=-1]])¶ Ожидает события. timeout в секундах (float)
16.1.2. Объекты опроса¶Polling Objects
Системный вызов poll(), поддерживаемый в большинстве Unix-систем, обеспечивает лучшую масштабируемость для сетевых серверов, обслуживающих множество клиентов одновременно. poll() масштабируется лучше, поскольку системный вызов требует только перечисления интересующих файловых дескрипторов, тогда как select() строит битовую маску, устанавливает биты для нужных файловых дескрипторов, а затем всю битовую маску приходится снова линейно сканировать. select() имеет сложность O(наибольший файловый дескриптор), а poll() – O(количество файловых дескрипторов).
-
poll.register(fd[, eventmask])¶ Регистрирует файловый дескриптор в объекте опроса. Последующие вызовы метода
poll()будут проверять, есть ли у файлового дескриптора ожидающие события ввода-вывода. fd может быть целым числом или объектом с методомfileno(), возвращающим целое число. Файловые объекты реализуютfileno(), поэтому их тоже можно использовать в качестве аргумента.eventmask – необязательная битовая маска, описывающая типы событий для проверки. Может быть комбинацией констант
POLLIN,POLLPRIиPOLLOUT, описанных в таблице ниже. Если не указана, по умолчанию проверяются все три типа событий.Константа
Значение
POLLINЕсть данные для чтения
POLLPRIЕсть срочные данные для чтения
POLLOUTГотов к выводу: запись не будет блокироваться
POLLERRУсловие ошибки (какого-либо рода)
POLLHUPРазъединение
POLLNVALНекорректный запрос: дескриптор не открыт
Регистрация уже зарегистрированного файлового дескриптора не является ошибкой и имеет тот же эффект, как если бы дескриптор был зарегистрирован ровно один раз.
-
poll.modify(fd, eventmask)¶ Изменяет уже зарегистрированный fd. Это имеет тот же эффект, что и
register(fd, eventmask). Попытка изменить файловый дескриптор, который никогда не был зарегистрирован, приводит к возбуждению исключенияIOErrorс errnoENOENT.Новое в версии 2.6.
-
poll.unregister(fd)¶ Удаляет файловый дескриптор, отслеживаемый объектом опроса. Как и метод
register(), fd может быть целым числом или объектом с методомfileno(), возвращающим целое число.Попытка удалить файловый дескриптор, который никогда не был зарегистрирован, приводит к возбуждению исключения
KeyError.
-
poll.poll([timeout])¶ Опрашивает набор зарегистрированных файловых дескрипторов и возвращает, возможно, пустой список, содержащий кортежи
(fd, event)из двух элементов для дескрипторов, по которым есть события или ошибки. fd – это файловый дескриптор, а event – битовая маска, в которой установлены биты для сообщённых событий этого дескриптора:POLLINдля ожидания ввода,POLLOUTуказывает, что дескриптор можно записывать, и так далее. Пустой список означает, что вызов завершился по таймауту и ни один файловый дескриптор не сообщил о событиях. Если задан timeout, он задаёт время в миллисекундах, в течение которого система будет ждать события перед возвратом. Если timeout опущен, отрицателен или равенNone, вызов будет блокироваться до появления события для этого объекта poll.
16.1.3. Объекты Kqueue¶Kqueue Objects
-
kqueue.close()¶ Закрывает файловый дескриптор управления объекта kqueue.
-
kqueue.fileno()¶ Возвращает номер файлового дескриптора управляющего fd.
-
kqueue.fromfd(fd)¶ Создаёт объект kqueue из заданного файлового дескриптора.
-
kqueue.control(changelist, max_events[, timeout]) → eventlist¶ Низкоуровневый интерфейс к kevent
changelist должен быть итерируемым объектом, содержащим объекты kevent, или
Nonemax_events должен быть 0 или положительным целым числом
тайм-аут в секундах (можно использовать числа с плавающей точкой); по умолчанию
None, что означает бесконечное ожидание
16.1.4. Объекты Kevent¶Kevent Objects
https://www.freebsd.org/cgi/man.cgi?query=kqueue&sektion=2
-
kevent.ident¶ Значение, используемое для идентификации события. Интерпретация зависит от фильтра, но обычно это файловый дескриптор. В конструкторе ident может быть целым числом или объектом с функцией fileno(). kevent хранит целое число внутренне.
-
kevent.filter¶ Имя фильтра ядра.
Константа
Значение
KQ_FILTER_READПринимает дескриптор и возвращает управление при появлении данных, доступных для чтения
KQ_FILTER_WRITEПринимает дескриптор и возвращает управление при появлении возможности записи
KQ_FILTER_AIOЗапросы AIO
KQ_FILTER_VNODEВозвращает управление при наступлении одного или нескольких запрошенных событий, за которыми ведется наблюдение в fflag
KQ_FILTER_PROCОтслеживание событий по идентификатору процесса
KQ_FILTER_NETDEVОтслеживание событий на сетевом устройстве [недоступно в Mac OS X]
KQ_FILTER_SIGNALВозвращает управление при доставке отслеживаемого сигнала процессу
KQ_FILTER_TIMERУстанавливает произвольный таймер
-
kevent.flags¶ Действие фильтра.
Константа
Значение
KQ_EV_ADDДобавляет или изменяет событие
KQ_EV_DELETEУдаляет событие из очереди
KQ_EV_ENABLEПозволяет control() вернуть событие
KQ_EV_DISABLEОтключает событие
KQ_EV_ONESHOTУдаляет событие после первого срабатывания
KQ_EV_CLEARСбрасывает состояние после извлечения события
KQ_EV_SYSFLAGSвнутреннее событие
KQ_EV_FLAG1внутреннее событие
KQ_EV_EOFУсловие EOF для конкретного фильтра
KQ_EV_ERRORСм. возвращаемые значения
-
kevent.fflags¶ Флаги, специфичные для фильтра
KQ_FILTER_READиKQ_FILTER_WRITEфлаги фильтра:Константа
Значение
KQ_NOTE_LOWATнижняя граница буфера сокета
KQ_FILTER_VNODEфлаги фильтра:Константа
Значение
KQ_NOTE_DELETEбыла вызвана unlink()
KQ_NOTE_WRITEпроизошла запись
KQ_NOTE_EXTENDфайл был расширен
KQ_NOTE_ATTRIBатрибут был изменён
KQ_NOTE_LINKколичество ссылок изменилось
KQ_NOTE_RENAMEфайл был переименован
KQ_NOTE_REVOKEдоступ к файлу был отозван
KQ_FILTER_PROCфлаги фильтра:Константа
Значение
KQ_NOTE_EXITпроцесс завершился
KQ_NOTE_FORKпроцесс вызвал fork()
KQ_NOTE_EXECпроцесс запустил новый процесс
KQ_NOTE_PCTRLMASKвнутренний флаг фильтра
KQ_NOTE_PDATAMASKвнутренний флаг фильтра
KQ_NOTE_TRACKотслеживать процесс через fork()
KQ_NOTE_CHILDвозвращено в дочернем процессе для NOTE_TRACK
KQ_NOTE_TRACKERRне удаётся подключиться к дочернему процессу
KQ_FILTER_NETDEVфлаги фильтра (недоступно в Mac OS X):Константа
Значение
KQ_NOTE_LINKUPсоединение активно
KQ_NOTE_LINKDOWNсоединение разорвано
KQ_NOTE_LINKINVсостояние соединения недействительно
-
kevent.data¶ Данные, специфичные для фильтра.
-
kevent.udata¶ Значение, определённое пользователем.