select — Ожидание завершения ввода-вывода
Этот модуль предоставляет доступ к функциям select() и poll(), доступным в большинстве операционных систем, devpoll() доступным в Solaris и производных системах, epoll() доступным в Linux 2.5+ и kqueue() доступным в большинстве систем BSD. Обратите внимание, что в Windows он работает только для сокетов; в других операционных системах он также работает с другими типами файлов (в частности, в Unix он работает с каналами). Он не может использоваться с обычными файлами для определения, вырос ли файл с момента последнего чтения.
Примечание
Модуль selectors позволяет реализовывать высокоуровневый и эффективный множественный ввод-вывод, построенный на основе примитивов модуля select. Пользователям рекомендуется использовать модуль selectors, если только они не хотят иметь точный контроль над используемыми примитивами на уровне операционной системы.
Модуль определяет следующие элементы:
-
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 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 объекты файлов (например,
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.Предупреждение
Регистрация уже зарегистрированного дескриптора файла не является ошибкой, но результат неопределён. Следует предварительно выполнить операцию отмены регистрации или изменения.
-
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, отслеживающие дескриптор. |
| Сокет типа stream: удалённое соединение или остановлена запись. |
| Эквивалентно |
| Можно прочитать данные приоритетного потока |
| Эквивалентно |
| Можно записать данные приоритетного потока |
| Игнорируется. |
Введено в версии 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.
-
epoll.poll(timeout=None, maxevents=-1) -
Ожидать событий. timeout в секундах (вещественное число).
Изменено в версии 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) -
Изменяет уже зарегистрированный дескриптор файла. Это имеет тот же эффект, что и
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() -
Возвращает номер дескриптора файла управляющего 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. - changelist должен быть итерируемым объектом kevent или
Объекты 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и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(не доступны в Mac OS X):Константа
Значение
KQ_NOTE_LINKUPсоединение установлено
KQ_NOTE_LINKDOWNсоединение разорвано
KQ_NOTE_LINKINVсостояние соединения недействительно
-
kevent.data -
Данные, специфичные для фильтра.
-
kevent.udata -
Значение, заданное пользователем.
© 2001–2022 Python Software Foundation
Licensed under the PSF License.
https://docs.python.org/3.8/library/select.html