Spec-Zone.ru › Python 3.12

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 ниже для методов, поддерживаемых объектами 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.

См. раздел Объекты опроса с триггерами ребер и уровней (epoll) ниже для методов, поддерживаемых объектами epolling.

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

Новый дескриптор файла является непередаваемым.

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

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

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

select.poll()

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

select.kqueue()

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

Новый дескриптор файла является непередаваемым.

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

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

(Поддерживается только на BSD.) Возвращает объект события ядра; см. раздел Объекты kevent ниже для методов, поддерживаемых объектами 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()

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

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.

END_OF_DOCUMENT_MARKER

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

Системный вызов 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–2024 Python Software Foundation
Licensed under the PSF License.
https://docs.python.org/3.12/library/select.html

Spec-Zone.ru

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