Spec-Zone.ru › Python 3.13

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

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

Примечание

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

Доступность: не WASI.

Этот модуль не работает или недоступен в WebAssembly. См. Платформы WebAssembly для получения дополнительной информации.

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

exception select.error

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

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

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 и более поздних версиях.) Возвращает объект опроса с пороговым триггером, который может быть использован как интерфейс с пороговым или уровнем срабатывания для событий ввода-вывода.

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

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

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

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

Результат — тройка списков объектов, которые готовы: подмножества первых трёх аргументов. Если таймаут истекает, без готовности дескриптора файла, возвращаются три пустых списка.

Среди допустимых типов объектов в итерируемых объектах находятся объекты Python file objects (например, 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.

END_OF_DOCUMENT_MARKER

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

Solaris и производные имеют /dev/poll. В то время как select() — O(наибольший дескриптор файла) и poll() — O(количество дескрипторов файлов), /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) кортежи 2-х элементов для дескрипторов, у которых есть события или ошибки для отчётности. fd — дескриптор файла, а event — битовая маска с установленными битами для отчётных событий для этого дескриптора — POLLIN для ожидания ввода, POLLOUT для указания возможности записи в дескриптор и так далее. Пустой список указывает на то, что вызов сработал с таймаутом, и ни у одного дескриптора файлов не было событий для отчёта. Если указан timeout, он задаёт длительность ожидания событий в миллисекундах, прежде чем функция вернётся. Если timeout опущен, равен -1 или None, вызов будет блокироваться, пока не произойдёт событие для этого объекта опроса.

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

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

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

eventmask

Константа

Значение

EPOLLIN

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

EPOLLOUT

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

EPOLLPRI

Неотложные данные для чтения

EPOLLERR

Произошла ошибка на связанном дескрипторе файла

EPOLLHUP

Произошёл сброс соединения на связанном дескрипторе файла

EPOLLET

Установить поведение срабатывания по краю, по умолчанию используется поведение срабатывания по уровню

EPOLLONESHOT

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

EPOLLEXCLUSIVE

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

EPOLLRDHUP

Клиент закрыл соединение или завершил запись в соединение.

EPOLLRDNORM

Эквивалентно EPOLLIN

EPOLLRDBAND

Данные высокой приоритетности могут быть прочитаны.

EPOLLWRNORM

Эквивалентно EPOLLOUT

EPOLLWRBAND

Данные высокой приоритетности могут быть записаны.

EPOLLMSG

Игнорируется.

Добавлен в версии 3.6: EPOLLEXCLUSIVE был добавлен. Он поддерживается только ядром Linux 4.5 или более поздними версиями.

epoll.close()

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

epoll.closed

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

epoll.fileno()

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

epoll.fromfd(fd)

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

epoll.register(fd[, eventmask])

Регистрировать дескриптор файла в объекте epoll.

epoll.modify(fd, eventmask)

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

epoll.unregister(fd)

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

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

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

Ожидать событий. timeout в секундах (float)

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

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

Системный вызов poll(), поддерживаемый в большинстве систем Unix, обеспечивает лучшую масштабируемость для сетевых серверов, обслуживающих множество клиентов одновременно. poll() масштабируется лучше, потому что системный вызов требует только перечисления дескрипторов файлов, которые нас интересуют, тогда как select() строит битовую карту, включает биты для дескрипторов файлов, которые нас интересуют, а затем всю битовую карту необходимо линейно отсканировать. 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 с errno 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.

kqueue.closed

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

kqueue.fileno()

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

kqueue.fromfd(fd)

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

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

Интерфейс низкого уровня к kevent

  • changelist должен быть итерируемым объектом кеvent или None
  • max_events должен быть 0 или положительным целым числом
  • timeout в секундах (возможны числа с плавающей точкой); по умолчанию None, для ожидания бесконечно

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

Объекты Kevent

https://man.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

Отслеживание событий на сетевом устройстве [недоступно в 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 флаги фильтра (недоступны в macOS):

Константа

Значение

KQ_NOTE_LINKUP

соединение установлено

KQ_NOTE_LINKDOWN

соединение разорвано

KQ_NOTE_LINKINV

состояние соединения недействительно

kevent.data

Данные, специфичные для фильтра.

kevent.udata

Пользовательское значение.

© 2001–2024 Python Software Foundation
Licensed under the PSF License.
https://docs.python.org/3.13/library/select.html

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API