select — Ожидание завершения ввода-вывода


Этот модуль предоставляет доступ к функциям select() и poll(), доступным в большинстве операционных систем, devpoll(), доступным в Solaris и производных от него, epoll(), доступным в Linux 2.5+ и kqueue() доступно на большинстве BSD. Обратите внимание, что в Windows это работает только с сокетами; в других операционных системах это также работает с файлами других типов (в частности, в Unix это работает с конвейерами). Это нельзя использовать для обычных файлов, чтобы определить, увеличился ли размер файла с момента его последнего чтения.

Примечание

Модуль selectors обеспечивает высокоуровневое и эффективное мультиплексирование ввода-вывода, построенное на примитивах модуля select. Пользователям рекомендуется вместо этого использовать модуль selectors, если только они не хотят точно контролировать используемые примитивы на уровне операционной системы.

Availability: это не Emscripten, это был не я.

Этот модуль не работает или недоступен на платформах WebAssembly wasm32-emscripten и wasm32-wasi. Дополнительную информацию смотрите в разделе Платформы веб-сборки.

Модуль определяет следующее:

exception select.error

Устаревший псевдоним OSError.

Изменено в версии 3.3: После PEP 3151 этому классу был присвоен псевдоним OSError.

select.devpoll()

(Поддерживается только в Solaris и производных от него системах.) Возвращает /dev/poll объект опроса; смотрите раздел /dev/poll Объекты опроса ниже для описания методов, поддерживаемых объектами опроса разработчиков.

devpoll() объекты привязаны к количеству файловых дескрипторов, допустимому на момент создания экземпляра. Если ваша программа уменьшит это значение, devpoll() завершится ошибкой. Если ваша программа увеличит это значение, devpoll() может вернуть неполный список активных файловых дескрипторов.

Новый файловый дескриптор будет иметь значение non-inheritable.

Добавлено в версии 3.3.

Изменено в версии 3.4: Новый файловый дескриптор теперь не передается по наследству.

select.epoll(sizehint=-1, flags=0)

(Поддерживается только в Linux 2.5.44 и более поздних версиях.) Возвращает объект опроса границ, который может использоваться в качестве интерфейса, запускаемого на границе или уровне, для событий ввода-вывода.

sizehint сообщает epoll об ожидаемом количестве зарегистрированных событий. Значение должно быть положительным или -1, чтобы использовать значение по умолчанию. Он используется только в старых системах, где epoll_create1() недоступен; в противном случае он не действует (хотя его значение по-прежнему проверяется).

параметр flags устарел и полностью игнорируется. Однако, если он указан, его значение должно быть 0 или select.EPOLL_CLOEXEC, в противном случае значение OSError будет увеличено.

Смотрите раздел Объекты, запускающие опрос по краям и уровням (epoll) ниже для получения информации о методах, поддерживаемых объектами опроса.

epoll объекты поддерживают протокол управления контекстом: при использовании в инструкции with новый файловый дескриптор автоматически закрывается в конце блока.

Новый файловый дескриптор будет иметь значение non-inheritable.

Изменено в версии 3.3: Добавлен параметр flags.

Изменено в версии 3.4: Добавлена поддержка инструкции with. Новый файловый дескриптор теперь не наследуется.

Не рекомендуется, начиная с версии 3.4: Параметр flags. select.EPOLL_CLOEXEC теперь используется по умолчанию. Используйте os.set_inheritable(), чтобы сделать файловый дескриптор наследуемым.

select.poll()

(Поддерживается не всеми операционными системами.) Возвращает объект опроса, который поддерживает регистрацию и отмену регистрации файловых дескрипторов, а затем опрашивает их на предмет событий ввода-вывода; методы, поддерживаемые объектами опроса, приведены в разделе Объекты опроса ниже.

select.kqueue()

(Поддерживается только в BSD.) Возвращает объект очереди ядра; смотрите раздел Объекты Kqueue ниже для описания методов, поддерживаемых объектами kqueue.

Новый файловый дескриптор будет иметь значение non-inheritable.

Изменено в версии 3.4: Новый файловый дескриптор теперь не передается по наследству.

select.kevent(ident, filter=KQ_FILTER_READ, flags=KQ_EV_ADD, fflags=0, data=0, udata=0)

(Поддерживается только в BSD.) Возвращает объект события ядра; смотрите раздел Невидимые объекты ниже для описания методов, поддерживаемых объектами kevent.

select.select(rlist, wlist, xlist[, timeout])

Это простой интерфейс к системному вызову Unix select(). Первые три аргумента - это повторяемые значения «ожидаемых объектов»: либо целые числа, представляющие файловые дескрипторы, либо объекты с методом без параметров с именем fileno(), возвращающим такое целое число:

  • rlist: дождитесь готовности к чтению

  • wlist: дождитесь готовности к записи

  • xlist: дождитесь «исключительного состояния» (смотрите страницу руководства, чтобы узнать, что ваша система считает таким состоянием).

Допустимы пустые повторяемые значения, но принятие трех пустых повторяемых значений зависит от платформы. (Известно, что это работает в Unix, но не в Windows) Необязательный аргумент timeout указывает время ожидания в виде числа с плавающей запятой в секундах. Если параметр timeout опущен, функция блокируется до тех пор, пока не будет готов хотя бы один файловый дескриптор. Нулевое значение времени ожидания определяет опрос и никогда не блокируется.

Возвращаемое значение представляет собой тройку списков объектов, которые готовы: подмножества первых трех аргументов. Когда время ожидания истекает, а файловый дескриптор не становится готовым, возвращаются три пустых списка.

Среди допустимых типов объектов в iterables - Python file objects (например, sys.stdin или объекты, возвращаемые open() или os.popen()), объекты сокетов, возвращаемые socket.socket(). Вы также можете сами определить класс wrapper, если у него есть соответствующий метод fileno() (который действительно возвращает файловый дескриптор, а не просто случайное целое число).

Примечание

Файловые объекты в Windows неприемлемы, но сокеты допустимы. В Windows базовая функция select() предоставляется библиотекой WinSock и не обрабатывает файловые дескрипторы, которые не исходят из WinSock.

Изменено в версии 3.5: Функция теперь отключается с пересчитанным временем ожидания при прерывании сигналом, за исключением случаев, когда обработчик сигнала вызывает исключение (см. PEP 475 для объяснения), вместо того, чтобы вызывать InterruptedError.

select.PIPE_BUF

Минимальное количество байт, которое может быть записано в канал без блокировки, когда канал был сообщен как готовый к записи с помощью select(), poll() или другого интерфейса в этом модуле. Это не относится к другим файловым объектам, таким как сокеты.

POSIX гарантирует, что это значение будет не менее 512.

Availability: Unix

Добавлено в версии 3.2.

/dev/poll Объекты опроса

Solaris и производные от него имеют значение /dev/poll. В то время как select() равно O(самый высокий файловый дескриптор), а poll() равно O(количество файловых дескрипторов), /dev/poll равно O(активные файловые дескрипторы).

/dev/poll поведение очень близко к стандартному : объекту c:func:!poll.

devpoll.close()

Закройте файловый дескриптор объекта опроса.

Добавлено в версии 3.4.

devpoll.closed

True если объект опроса закрыт.

Добавлено в версии 3.4.

devpoll.fileno()

Возвращает номер файлового дескриптора объекта опроса.

Добавлено в версии 3.4.

devpoll.register(fd[, eventmask])

Зарегистрируйте файловый дескриптор с помощью объекта опроса. При последующих вызовах метода poll() будет проверяться, есть ли в файловом дескрипторе какие-либо ожидающие события ввода-вывода. fd может быть либо целым числом, либо объектом с методом fileno(), который возвращает целое число. Файловые объекты реализуют fileno(), поэтому их также можно использовать в качестве аргумента.

eventmask - это необязательная битовая маска, описывающая тип событий, которые вы хотите проверить. Константы те же, что и в случае с poll() object. Значением по умолчанию является комбинация констант POLLIN, POLLPRI, и POLLOUT.

Предупреждение

Регистрация файлового дескриптора, который уже зарегистрирован, не является ошибкой, но результат не определен. Сначала необходимо отменить регистрацию или изменить ее. Это важное отличие от poll().

devpoll.modify(fd[, eventmask])

Этот метод выполняет unregister(), за которым следует register(). Это (немного) эффективнее, чем делать то же самое явно.

devpoll.unregister(fd)

Удалите файловый дескриптор, отслеживаемый объектом опроса. Так же, как и в методе register(), fd может быть целым числом или объектом с методом fileno(), который возвращает целое число.

Попытка удалить файловый дескриптор, который никогда не был зарегистрирован, благополучно игнорируется.

devpoll.poll([timeout])

Опрашивает набор зарегистрированных файловых дескрипторов и возвращает, возможно, пустой список, содержащий (fd, event) 2-кортежа для дескрипторов, в которых есть события или ошибки, о которых нужно сообщить. fd - это файловый дескриптор, а event - это битовая маска с битами, установленными для сообщаемых событий для этого дескриптора — POLLIN для ожидающего ввода, POLLOUT, чтобы указать, что в дескриптор можно записать, и так далее. Пустой список указывает на то, что время ожидания вызова истекло и в файловых дескрипторах не было никаких событий, о которых можно было бы сообщить. Если задан параметр timeout, то он указывает период времени в миллисекундах, в течение которого система будет ожидать событий перед возвратом. Если значение timeout опущено, равно -1 или None, вызов будет заблокирован до тех пор, пока не произойдет событие для этого объекта опроса.

Изменено в версии 3.5: Функция теперь отключается с пересчитанным временем ожидания при прерывании сигналом, за исключением случаев, когда обработчик сигнала вызывает исключение (см. PEP 475 для объяснения), вместо того, чтобы вызывать InterruptedError.

Объекты, запускающие опрос по краям и уровням (epoll)

https://linux.die.net/man/4/epoll

маска события

Постоянный

Значение

EPOLLIN

Доступно для чтения

EPOLLOUT

Доступно для записи

EPOLLPRI

Срочные данные для чтения

EPOLLERR

В assoc. fd произошла ошибка.

EPOLLHUP

Зависание произошло на доц. фд

EPOLLET

Установите поведение триггера Edge, по умолчанию используется поведение триггера Level

EPOLLONESHOT

Установите режим одноразового использования. После извлечения одного события функция fd отключается

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])

Зарегистрируйте дескриптор fd с помощью объекта epoll.

epoll.modify(fd, eventmask)

Измените зарегистрированный файловый дескриптор.

epoll.unregister(fd)

Удалите зарегистрированный файловый дескриптор из объекта epoll.

Изменено в версии 3.9: Метод больше не игнорирует ошибку EBADF.

epoll.poll(timeout=None, maxevents=-1)

Дождитесь событий. время ожидания в секундах (плавающее значение)

Изменено в версии 3.5: Функция теперь отключается с пересчитанным временем ожидания при прерывании сигналом, за исключением случаев, когда обработчик сигнала вызывает исключение (см. PEP 475 для объяснения), вместо того, чтобы вызывать InterruptedError.

Объекты опроса

Системный вызов poll(), поддерживаемый большинством систем Unix, обеспечивает лучшую масштабируемость для сетевых серверов, обслуживающих очень много клиентов одновременно. poll() лучше масштабируется, поскольку для системного вызова требуется только перечислить интересующие файловые дескрипторы, в то время как select() создает растровое изображение, включает биты для интересующих fds, а затем все растровое изображение снова должно быть линейно отсканировано. select() - это O(самый высокий файловый дескриптор), в то время как poll() - это O(количество файловых дескрипторов).

poll.register(fd[, eventmask])

Зарегистрируйте файловый дескриптор с помощью объекта опроса. При последующих вызовах метода poll() будет проверяться, есть ли в файловом дескрипторе какие-либо ожидающие события ввода-вывода. fd может быть либо целым числом, либо объектом с методом fileno(), который возвращает целое число. Файловые объекты реализуют fileno(), поэтому их также можно использовать в качестве аргумента.

eventmask - это необязательная битовая маска, описывающая тип событий, которые вы хотите проверить, и может представлять собой комбинацию констант POLLIN, POLLPRI, и POLLOUT, описанных в таблице ниже. Если не указано, то будет проверяться значение по умолчанию для всех 3 типов событий.

Постоянный

Значение

POLLIN

Есть данные для чтения

POLLPRI

Необходимо срочно ознакомиться с данными

POLLOUT

Готово к выводу: запись не будет заблокирована

POLLERR

Какое-то ошибочное состояние

POLLHUP

Повесить трубку

POLLRDHUP

Одноранговый узел потокового сокета закрыл соединение или завершил запись половины соединения

POLLNVAL

Неверный запрос: дескриптор не открыт

Регистрация файлового дескриптора, который уже зарегистрирован, не является ошибкой и имеет тот же эффект, что и регистрация дескриптора ровно один раз.

poll.modify(fd, eventmask)

Изменяет уже зарегистрированный fd. Это имеет тот же эффект, что и register(fd, eventmask). Попытка изменить файловый дескриптор, который никогда не регистрировался, приводит к возникновению исключения OSError с ошибкой ENOENT.

poll.unregister(fd)

Удалите файловый дескриптор, отслеживаемый объектом опроса. Так же, как и в методе register(), fd может быть целым числом или объектом с методом fileno(), который возвращает целое число.

Попытка удалить файловый дескриптор, который никогда не был зарегистрирован, приводит к возникновению исключения KeyError.

poll.poll([timeout])

Опрашивает набор зарегистрированных файловых дескрипторов и возвращает, возможно, пустой список, содержащий (fd, event) 2-кортежа для дескрипторов, в которых есть события или ошибки, о которых нужно сообщить. fd - это файловый дескриптор, а event - это битовая маска с битами, установленными для сообщаемых событий для этого дескриптора — POLLIN для ожидающего ввода, POLLOUT, чтобы указать, что в дескриптор можно записать, и так далее. Пустой список указывает на то, что время ожидания вызова истекло и в файловых дескрипторах не было никаких событий, о которых можно было бы сообщить. Если задан параметр timeout, то он указывает период времени в миллисекундах, в течение которого система будет ожидать событий перед возвратом. Если значение timeout опущено, отрицательно или None, вызов будет заблокирован до тех пор, пока не произойдет событие для этого объекта опроса.

Изменено в версии 3.5: Функция теперь отключается с пересчитанным временем ожидания при прерывании сигналом, за исключением случаев, когда обработчик сигнала вызывает исключение (см. PEP 475 для объяснения), вместо того, чтобы вызывать InterruptedError.

Объекты Kqueue

kqueue.close()

Закройте дескриптор управляющего файла объекта очереди.

kqueue.closed

True если объект очереди закрыт.

kqueue.fileno()

Возвращает номер файлового дескриптора элемента управления fd.

kqueue.fromfd(fd)

Создайте объект очереди из заданного файлового дескриптора.

kqueue.control(changelist, max_events[, timeout]) eventlist

Низкоуровневый интерфейс с kevent

  • список изменений должен состоять из повторяющихся объектов kevent или None

  • значение max_events должно быть равно 0 или положительному целому числу

  • время ожидания в секундах (возможно с плавающим значением); значение по умолчанию None, ожидание бесконечно

Изменено в версии 3.5: Функция теперь отключается с пересчитанным временем ожидания при прерывании сигналом, за исключением случаев, когда обработчик сигнала вызывает исключение (см. PEP 475 для объяснения), вместо того, чтобы вызывать InterruptedError.

Невидимые объекты

https://man.freebsd.org/cgi/man.cgi?query=kqueue&sektion=2

kevent.ident

Значение, используемое для идентификации события. Интерпретация зависит от фильтра, но обычно это файловый дескриптор. В конструкторе ident может быть либо int, либо объектом с методом fileno(). kevent хранит целое число внутри.

kevent.filter

Имя фильтра ядра.

Постоянный

Значение

KQ_FILTER_READ

Принимает дескриптор и возвращает его всякий раз, когда есть доступные для чтения данные

KQ_FILTER_WRITE

Принимает дескриптор и возвращает его всякий раз, когда есть доступные для записи данные

KQ_FILTER_AIO

Запросы AIO

KQ_FILTER_VNODE

Возвращает, когда происходит одно или несколько запрошенных событий, отслеживаемых в fflag

KQ_FILTER_PROC

Следите за событиями, связанными с идентификатором процесса

KQ_FILTER_NETDEV

Отслеживание событий на сетевом устройстве [недоступно в macOS]

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):

Постоянный

Значение

KQ_NOTE_LINKUP

связь установлена

KQ_NOTE_LINKDOWN

связь прервана

KQ_NOTE_LINKINV

состояние ссылки недопустимо

kevent.data

Фильтруйте конкретные данные.

kevent.udata

Значение, определяемое пользователем.

Вернуться на верх