Содержание страницы
select – Ожидание завершения ввода-вывода¶select – Waiting for I/O completion
Этот модуль предоставляет доступ к функциям select() и poll(),
доступным в большинстве операционных систем, devpoll() – на
Solaris и производных, epoll() – на Linux 2.5+ и
kqueue() – на большинстве BSD.
Обратите внимание: в Windows он работает только с сокетами; в других ОС
он также работает с другими типами файлов (в частности, в Unix – с каналами).
Его нельзя использовать для обычных файлов, чтобы определить, увеличился ли файл
с момента последнего чтения.
Примечание
Модуль selectors предоставляет высокоуровневую и эффективную мультиплексацию ввода-вывода,
построенную на примитивах модуля select. Пользователям рекомендуется
использовать модуль selectors, если только им не требуется
точный контроль над используемыми низкоуровневыми примитивами ОС.
Модуль определяет следующее:
-
select.devpoll()¶ Поддерживается только на Solaris и производных. Возвращает объект
/dev/pollопроса; см. раздел /dev/poll Polling Objects ниже для методов, поддерживаемых объектами devpoll.Объекты
devpoll()привязаны к количеству файловых дескрипторов, разрешённых на момент создания. Если программа уменьшает это значение,devpoll()завершится ошибкой. Если программа увеличивает это значение,devpoll()может вернуть неполный список активных файловых дескрипторов.Новый файловый дескриптор является ненаследуемым.
Новое в версии 3.3.
Изменено в версии 3.4: Новый файловый дескриптор теперь не наследуется.
-
select.epoll(sizehint=-1, flags=0)¶ Поддерживается только на Linux 2.5.44 и новее. Возвращает объект опроса, работающий по фронту (edge polling), который можно использовать как интерфейс с триггером по фронту или уровню для событий ввода-вывода.
Параметр sizehint сообщает epoll ожидаемое количество регистрируемых событий. Он должен быть положительным, либо -1 для использования значения по умолчанию. Он используется только в старых системах, где
epoll_create1()недоступен; в противном случае он не имеет эффекта (хотя его значение по-прежнему проверяется).Параметр flags устарел и полностью игнорируется. Однако, если он указан, его значение должно быть
0илиselect.EPOLL_CLOEXEC, иначе возбуждаетсяOSError.См. раздел Edge and Level Trigger Polling (epoll) Objects ниже для методов, поддерживаемых объектами epoll.
Объекты
epollподдерживают протокол менеджера контекста: при использовании в инструкцииwithновый файловый дескриптор автоматически закрывается в конце блока.Новый файловый дескриптор является ненаследуемым.
Изменено в версии 3.3: Добавлен параметр flags.
Изменено в версии 3.4: Добавлена поддержка инструкции
with. Теперь новый файловый дескриптор является ненаследуемым.Устарело с версии 3.4: Параметр flags. Теперь по умолчанию используется
select.EPOLL_CLOEXEC. Используйтеos.set_inheritable(), чтобы сделать файловый дескриптор наследуемым.
-
select.poll()¶ Поддерживается не всеми операционными системами. Возвращает объект опроса, который поддерживает регистрацию и отмену регистрации файловых дескрипторов, а затем опрос их на предмет событий ввода-вывода; см. раздел Polling Objects ниже для методов, поддерживаемых объектами опроса.
-
select.kqueue()¶ Поддерживается только на BSD. Возвращает объект очереди ядра; см. раздел Kqueue Objects ниже для методов, поддерживаемых объектами kqueue.
Новый файловый дескриптор является ненаследуемым.
Изменено в версии 3.4: Новый файловый дескриптор теперь не наследуется.
-
select.kevent(ident, filter=KQ_FILTER_READ, flags=KQ_EV_ADD, fflags=0, data=0, udata=0)¶ Поддерживается только на BSD. Возвращает объект события ядра; см. раздел Kevent Objects ниже для методов, поддерживаемых объектами kevent.
-
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.Изменено в версии 3.5: Функция теперь повторяется с пересчитанным тайм-аутом при прерывании сигналом, за исключением случая, когда обработчик сигнала вызывает исключение (см. PEP 475 для обоснования), вместо вызова
InterruptedError.
-
select.PIPE_BUF¶ Минимальное количество байт, которое можно записать в канал без блокировки, когда канал сообщён как готовый к записи с помощью
select(),poll()или другого интерфейса в этом модуле. Это не относится к другим файлоподобным объектам, таким как сокеты.Это значение гарантируется POSIX равным не менее 512.
Доступность: Unix
Новое в версии 3.2.
/dev/poll Объекты опроса¶/dev/poll Polling Objects
Solaris и их производные имеют /dev/poll. В то время как select() работает за
O(наибольший файловый дескриптор), а poll() – за O(количество файловых
dескрипторов), /dev/poll работает за O(активные файловые дескрипторы).
Поведение /dev/poll очень близко к стандартному объекту poll().
-
devpoll.close()¶ Закрывает файловый дескриптор объекта опроса.
Новое в версии 3.4.
-
devpoll.closed¶ Trueесли объект опроса закрыт.Новое в версии 3.4.
-
devpoll.fileno()¶ Возвращает номер файлового дескриптора объекта опроса.
Новое в версии 3.4.
-
devpoll.register(fd[, eventmask])¶ Регистрирует файловый дескриптор в объекте опроса. Последующие вызовы метода
poll()будут проверять, есть ли у файлового дескриптора ожидающие события ввода-вывода. fd может быть целым числом или объектом с методомfileno(), возвращающим целое число. Файловые объекты реализуютfileno(), поэтому их тоже можно использовать в качестве аргумента.eventmask – необязательная битовая маска, описывающая тип событий для проверки. Константы те же, что и у объекта
poll(). Значение по умолчанию – комбинация константPOLLIN,POLLPRIиPOLLOUT.Предупреждение
Регистрация уже зарегистрированного файлового дескриптора не является ошибкой, но результат не определен. Правильным действием будет сначала отменить регистрацию или изменить его. Это важное отличие от
poll().
-
devpoll.modify(fd[, eventmask])¶ Этот метод выполняет
unregister(), а затемregister(). Это (немного) эффективнее, чем делать то же самое явно.
-
devpoll.unregister(fd)¶ Удаляет файловый дескриптор, отслеживаемый объектом опроса. Как и метод
register(), fd может быть целым числом или объектом с методомfileno(), возвращающим целое число.Попытка удалить файловый дескриптор, который никогда не был зарегистрирован, безопасно игнорируется.
-
devpoll.poll([timeout])¶ Опрашивает набор зарегистрированных файловых дескрипторов и возвращает, возможно, пустой список, содержащий кортежи
(fd, event)из двух элементов для дескрипторов, по которым есть события или ошибки. fd – это файловый дескриптор, а event – битовая маска, в которой установлены биты для сообщённых событий этого дескриптора:POLLINдля ожидания ввода,POLLOUTуказывает, что дескриптор можно записывать, и так далее. Пустой список означает, что вызов завершился по таймауту и ни один файловый дескриптор не сообщил о событиях. Если задан timeout, он задаёт время в миллисекундах, в течение которого система будет ждать события перед возвратом. Если timeout опущен, равен -1 илиNone, вызов будет блокироваться до появления события для этого объекта poll.Изменено в версии 3.5: Функция теперь повторяется с пересчитанным тайм-аутом при прерывании сигналом, за исключением случая, когда обработчик сигнала вызывает исключение (см. PEP 475 для обоснования), вместо вызова
InterruptedError.
Объекты опроса с триггером по фронту и уровню (epoll)¶Edge and Level Trigger Polling (epoll) Objects
https://linux.die.net/man/4/epoll
eventmask
Константа
Значение
EPOLLINДоступен для чтения
EPOLLOUTДоступен для записи
EPOLLPRIСрочные данные для чтения
EPOLLERRВозникла ошибка на ассоциированном файловом дескрипторе
EPOLLHUPПроизошёл разрыв соединения на ассоциированном файловом дескрипторе
EPOLLETУстановить триггер по фронту (Edge Trigger), по умолчанию – триггер по уровню (Level Trigger)
EPOLLONESHOTУстановить одноразовое поведение. После извлечения одного события файловый дескриптор внутренне отключается.
EPOLLEXCLUSIVEПробуждать только один объект epoll, когда связанный fd имеет событие. По умолчанию (если этот флаг не установлен) пробуждаются все объекты epoll, ожидающие на fd.
EPOLLRDHUPПотоковый сокет: удаленная сторона закрыла соединение или завершила записывающую половину соединения.
EPOLLRDNORMЭквивалентно
EPOLLIN
EPOLLRDBANDПолоса приоритетных данных доступна для чтения.
EPOLLWRNORMЭквивалентно
EPOLLOUT
EPOLLWRBANDПриоритетные данные могут быть записаны.
EPOLLMSGИгнорируется.
Новое в версии 3.6:
EPOLLEXCLUSIVEбыл добавлен. Поддерживается только ядром Linux 4.5 или новее.
-
epoll.close()¶ Закрывает управляющий файловый дескриптор объекта epoll.
-
epoll.closed¶ True, если объект epoll закрыт.
-
epoll.fileno()¶ Возвращает номер файлового дескриптора управляющего fd.
-
epoll.fromfd(fd)¶ Создает объект epoll из заданного файлового дескриптора.
-
epoll.register(fd[, eventmask])¶ Регистрирует файловый дескриптор в объекте epoll.
-
epoll.modify(fd, eventmask)¶ Изменяет зарегистрированный файловый дескриптор.
-
epoll.unregister(fd)¶ Удаляет зарегистрированный файловый дескриптор из объекта epoll.
-
epoll.poll(timeout=-1, maxevents=-1)¶ Ожидает события. timeout в секундах (float)
Изменено в версии 3.5: Функция теперь повторяется с пересчитанным тайм-аутом при прерывании сигналом, за исключением случая, когда обработчик сигнала вызывает исключение (см. PEP 475 для обоснования), вместо вызова
InterruptedError.
Объекты опроса¶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Разъединение
POLLRDHUPПотоковый сокет: удаленная сторона закрыла соединение или закрыла запись в половине соединения
POLLNVALНекорректный запрос: дескриптор не открыт
Регистрация уже зарегистрированного файлового дескриптора не является ошибкой и имеет тот же эффект, как если бы дескриптор был зарегистрирован ровно один раз.
-
poll.modify(fd, eventmask)¶ Изменяет уже зарегистрированный fd. Это имеет тот же эффект, что и
register(fd, eventmask). Попытка изменить файловый дескриптор, который никогда не был зарегистрирован, приводит к возбуждению исключенияOSErrorс errnoENOENT.
-
poll.unregister(fd)¶ Удаляет файловый дескриптор, отслеживаемый объектом опроса. Как и метод
register(), fd может быть целым числом или объектом с методомfileno(), возвращающим целое число.Попытка удалить файловый дескриптор, который никогда не был зарегистрирован, приводит к возбуждению исключения
KeyError.
-
poll.poll([timeout])¶ Опрашивает набор зарегистрированных файловых дескрипторов и возвращает, возможно, пустой список, содержащий кортежи
(fd, event)из двух элементов для дескрипторов, по которым есть события или ошибки. fd – это файловый дескриптор, а event – битовая маска, в которой установлены биты для сообщённых событий этого дескриптора:POLLINдля ожидания ввода,POLLOUTуказывает, что дескриптор можно записывать, и так далее. Пустой список означает, что вызов завершился по таймауту и ни один файловый дескриптор не сообщил о событиях. Если задан timeout, он задаёт время в миллисекундах, в течение которого система будет ждать события перед возвратом. Если timeout опущен, отрицателен или равенNone, вызов будет блокироваться до появления события для этого объекта poll.Изменено в версии 3.5: Функция теперь повторяется с пересчитанным тайм-аутом при прерывании сигналом, за исключением случая, когда обработчик сигнала вызывает исключение (см. PEP 475 для обоснования), вместо вызова
InterruptedError.
Объекты Kqueue¶Kqueue Objects
-
kqueue.close()¶ Закрывает файловый дескриптор управления объекта kqueue.
-
kqueue.closed¶ True, если объект kqueue закрыт.
-
kqueue.fileno()¶ Возвращает номер файлового дескриптора управляющего fd.
-
kqueue.fromfd(fd)¶ Создаёт объект kqueue из заданного файлового дескриптора.
-
kqueue.control(changelist, max_events[, timeout]) → eventlist¶ Низкоуровневый интерфейс к kevent
changelist должен быть итерируемым объектом, содержащим объекты kevent, или
Nonemax_events должен быть 0 или положительным целым числом
тайм-аут в секундах (можно использовать числа с плавающей точкой); по умолчанию
None, что означает бесконечное ожидание
Изменено в версии 3.5: Функция теперь повторяется с пересчитанным тайм-аутом при прерывании сигналом, за исключением случая, когда обработчик сигнала вызывает исключение (см. PEP 475 для обоснования), вместо вызова
InterruptedError.
Объекты 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¶ Значение, определённое пользователем.