select — Ожидание завершения ввода-вывода
Этот модуль предоставляет доступ к функциям select() и poll(), доступным в большинстве операционных систем, devpoll(), доступным в Solaris и производных системах, epoll(), доступным в Linux 2.5+ и kqueue(), доступным в большинстве систем BSD. Обратите внимание, что в Windows он работает только для сокетов; в других операционных системах он также работает для других типов файлов (в частности, в Unix он работает с каналами). Он не может использоваться с обычными файлами для определения, увеличился ли размер файла с момента последнего чтения.
Примечание
Модуль selectors позволяет осуществлять высокоуровневое и эффективное множественное управление вводом-выводом, построенное на основе примитивов модуля select. Пользователям рекомендуется использовать модуль selectors, если только они не хотят иметь точный контроль над примитивами на уровне операционной системы.
Доступность: не WASI.
Этот модуль не работает или недоступен в WebAssembly. См. Платформы WebAssembly для получения дополнительной информации.
Модуль определяет следующее:
-
exception select.error -
Устаревший псевдоним класса
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.
/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
Константа | Значение |
|---|---|
| Доступно для чтения |
| Доступно для записи |
| Неотложные данные для чтения |
| Произошла ошибка на связанном дескрипторе файла |
| Произошёл сброс соединения на связанном дескрипторе файла |
| Установить поведение срабатывания по краю, по умолчанию используется поведение срабатывания по уровню |
| Установить одноразовое поведение. После извлечения одного события дескриптор файла внутри отключается |
| Разбудить только один объект epoll, когда у связанного дескриптора файла есть событие. По умолчанию (если этот флаг не установлен) разбуждаются все объекты epoll, опрашивающие дескриптор файла. |
| Клиент закрыл соединение или завершил запись в соединение. |
| Эквивалентно |
| Данные высокой приоритетности могут быть прочитаны. |
| Эквивалентно |
| Данные высокой приоритетности могут быть записаны. |
| Игнорируется. |
Добавлен в версии 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с errnoENOENT.
-
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. - changelist должен быть итерируемым объектом кеvent или
Объекты 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_DELETEunlink() был вызван
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