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 или положительному целому числу
- timeout задаётся в секундах (допускаются числа с плавающей точкой); по умолчанию используется
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.12/library/select.html