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.
-
select.devpoll() -
(Поддерживается только в Solaris и производных системах.) Возвращает объект опроса
/dev/poll; поддерживаемые объектами devpoll методы описаны ниже в разделе Объекты опроса /dev/poll.Объекты
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 методы описаны ниже в разделе Объекты опроса по фронту и уровню сигнала (epoll).
Объекты
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 не указан, функция блокируется до готовности хотя бы одного файлового дескриптора. Значение времени ожидания, равное нулю, задаёт опрос без блокировки.
Возвращаемое значение — кортеж из трёх списков готовых объектов: подмножеств первых трёх аргументов. Если время ожидания истекло, а ни один файловый дескриптор не стал готовым, возвращаются три пустых списка.
К допустимым типам объектов в итерируемых объектах относятся файловые объекты 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)кортежи из двух элементов для дескрипторов, о которых нужно сообщить события или ошибки. 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) -
Ожидает события. Время ожидания задаётся в секундах (числом с плавающей точкой).
Изменено в версии 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, описанных в таблице ниже. Если значение не задано, по умолчанию проверяются все три типа событий.Константа
Значение
POLLINЕсть данные для чтения
POLLPRIЕсть срочные данные для чтения
POLLOUTГотов к выводу: запись не будет блокироваться
POLLERRВозникла ошибка какого-либо рода
POLLHUPСоединение разорвано
POLLRDHUPПартнёр по потоковому сокету закрыл соединение или завершил передачу данных в одном направлении
POLLNVALНедопустимый запрос: дескриптор не открыт
Повторная регистрация уже зарегистрированного файлового дескриптора не считается ошибкой и равносильна однократной регистрации дескриптора.
-
poll.modify(fd, eventmask) -
Изменяет уже зарегистрированный файловый дескриптор. Результат такой же, как при вызове
register(fd, eventmask). Попытка изменить файловый дескриптор, который никогда не регистрировался, вызывает исключениеOSErrorс кодом errnoENOENT.
-
poll.unregister(fd) -
Удаляет файловый дескриптор из списка отслеживаемых объектом опроса. Как и в методе
register(), в качестве fd можно передать целое число или объект с методомfileno(), возвращающим целое число.Попытка удалить файловый дескриптор, который никогда не регистрировался, вызывает исключение
KeyError.
-
poll.poll([timeout]) -
Опросить набор зарегистрированных файловых дескрипторов и вернуть, возможно, пустой список, содержащий
(fd, event)кортежи из двух элементов для дескрипторов, о которых нужно сообщить события или ошибки. 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 или положительным целым числом
- время ожидания задаётся в секундах (допускаются числа с плавающей точкой); значение по умолчанию —
None, то есть бесконечное ожидание
Изменено в версии 3.5: Теперь при прерывании сигналом функция вызывается повторно с пересчитанным временем ожидания, кроме случаев, когда обработчик сигнала вызывает исключение (обоснование см. в PEP 475); вместо этого исключение
InterruptedErrorне вызывается. - changelist должен быть итерируемым объектом, содержащим объекты kevent, или
Объекты 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.11/library/select.html