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; см. раздел /dev/poll Поlling 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 и Level Trigger Polling (epoll) Objects ниже для методов, поддерживаемых объектами epolling.
Объекты
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 файловые объекты (например,
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
Константа | Значение |
|---|---|
| Доступен для чтения |
| Доступен для записи |
| Неотложные данные для чтения |
| Произошла ошибка в ассоциированном дескрипторе файла |
| Произошла отвязка в ассоциированном дескрипторе файла |
| Установить поведение срабатывания по краю, по умолчанию — поведение срабатывания по уровню |
| Установить одноразовое поведение. После извлечения одного события fd внутренне отключается |
| Разбудить только один объект epoll, когда у ассоциированного fd есть событие. По умолчанию (если этот флаг не установлен) разбудить все объекты epoll, опрашивающие fd. |
| Клиент сокета потокового типа закрыл подключение или остановил запись в половину подключения. |
| Эквивалентно |
| Данные с приоритетом могут быть прочитаны. |
| Эквивалентно |
| Данные с приоритетом могут быть записаны. |
| Игнорируется. |
Новое в версии 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.
Изменено в версии 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 должен быть итерируемым объектом 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–2023 Python Software Foundation
Licensed under the PSF License.
https://docs.python.org/3.11/library/select.html