Spec-Zone.ru › Python 3.7

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

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

Примечание

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

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

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

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.

/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

Возникла ошибка в ассоциированном fd

EPOLLHUP

Произошла отвязка в ассоциированном fd

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.

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

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

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

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

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

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

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://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 и %%%CODE_BLOCK_168%%:

Константа

Значение

KQ_NOTE_LOWAT

нижняя граница заполнения буфера сокета

Флаги фильтров %%%CODE_BLOCK_170%%:

Константа

Значение

KQ_NOTE_DELETE

вызвана unlink()

KQ_NOTE_WRITE

произошла запись

KQ_NOTE_EXTEND

файл был расширен

KQ_NOTE_ATTRIB

было изменено свойство

KQ_NOTE_LINK

изменилось число ссылок

KQ_NOTE_RENAME

файл был переименован

KQ_NOTE_REVOKE

доступ к файлу был отозван

Флаги фильтров %%%CODE_BLOCK_178%%:

Константа

Значение

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

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

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

Spec-Zone.ru

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