Spec-Zone.ru › Python 3.11

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

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

Примечание

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

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

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

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

exception select.error

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

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

select.devpoll()

(Поддерживается только в Solaris и производных системах.) Возвращает объект опроса /dev/poll; см. раздел /dev/poll Поlling 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 и Level Trigger Polling (epoll) Objects ниже для методов, поддерживаемых объектами epolling.

Объекты 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 файловые объекты (например, 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

Установить одноразовое поведение. После извлечения одного события 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)

Ожидать событий. 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 должен быть итерируемым объектом kevent или 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–2023 Python Software Foundation
Licensed under the PSF License.
https://docs.python.org/3.11/library/select.html

Spec-Zone.ru

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