select — Ожидание завершения ввода-вывода¶
Этот модуль предоставляет доступ к функциям select() и poll(), доступным в большинстве операционных систем, devpoll(), доступным в Solaris и производных от него, epoll(), доступным в Linux 2.5+ и kqueue() доступно на большинстве BSD. Обратите внимание, что в Windows это работает только с сокетами; в других операционных системах это также работает с файлами других типов (в частности, в Unix это работает с конвейерами). Это нельзя использовать для обычных файлов, чтобы определить, увеличился ли размер файла с момента его последнего чтения.
Примечание
Модуль selectors обеспечивает высокоуровневое и эффективное мультиплексирование ввода-вывода, построенное на примитивах модуля select. Пользователям рекомендуется вместо этого использовать модуль selectors, если только они не хотят точно контролировать используемые примитивы на уровне операционной системы.
Availability: это не Emscripten, это был не я.
Этот модуль не работает или недоступен на платформах WebAssembly wasm32-emscripten и wasm32-wasi. Дополнительную информацию смотрите в разделе Платформы веб-сборки.
Модуль определяет следующее:
- select.devpoll()¶
(Поддерживается только в Solaris и производных от него системах.) Возвращает
/dev/pollобъект опроса; смотрите раздел /dev/poll Объекты опроса ниже для описания методов, поддерживаемых объектами опроса разработчиков.devpoll()объекты привязаны к количеству файловых дескрипторов, допустимому на момент создания экземпляра. Если ваша программа уменьшит это значение,devpoll()завершится ошибкой. Если ваша программа увеличит это значение,devpoll()может вернуть неполный список активных файловых дескрипторов.Новый файловый дескриптор будет иметь значение non-inheritable.
Добавлено в версии 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объекты поддерживают протокол управления контекстом: при использовании в инструкцииwithновый файловый дескриптор автоматически закрывается в конце блока.Новый файловый дескриптор будет иметь значение non-inheritable.
Изменено в версии 3.3: Добавлен параметр flags.
Изменено в версии 3.4: Добавлена поддержка инструкции
with. Новый файловый дескриптор теперь не наследуется.Не рекомендуется, начиная с версии 3.4: Параметр flags.
select.EPOLL_CLOEXECтеперь используется по умолчанию. Используйтеos.set_inheritable(), чтобы сделать файловый дескриптор наследуемым.
- select.poll()¶
(Поддерживается не всеми операционными системами.) Возвращает объект опроса, который поддерживает регистрацию и отмену регистрации файловых дескрипторов, а затем опрашивает их на предмет событий ввода-вывода; методы, поддерживаемые объектами опроса, приведены в разделе Объекты опроса ниже.
- select.kqueue()¶
(Поддерживается только в BSD.) Возвращает объект очереди ядра; смотрите раздел Объекты Kqueue ниже для описания методов, поддерживаемых объектами kqueue.
Новый файловый дескриптор будет иметь значение non-inheritable.
Изменено в версии 3.4: Новый файловый дескриптор теперь не передается по наследству.
- select.kevent(ident, filter=KQ_FILTER_READ, flags=KQ_EV_ADD, fflags=0, data=0, udata=0)¶
(Поддерживается только в BSD.) Возвращает объект события ядра; смотрите раздел Невидимые объекты ниже для описания методов, поддерживаемых объектами kevent.
- select.select(rlist, wlist, xlist[, timeout])¶
Это простой интерфейс к системному вызову Unix
select(). Первые три аргумента - это повторяемые значения «ожидаемых объектов»: либо целые числа, представляющие файловые дескрипторы, либо объекты с методом без параметров с именемfileno(), возвращающим такое целое число:rlist: дождитесь готовности к чтению
wlist: дождитесь готовности к записи
xlist: дождитесь «исключительного состояния» (смотрите страницу руководства, чтобы узнать, что ваша система считает таким состоянием).
Допустимы пустые повторяемые значения, но принятие трех пустых повторяемых значений зависит от платформы. (Известно, что это работает в Unix, но не в Windows) Необязательный аргумент timeout указывает время ожидания в виде числа с плавающей запятой в секундах. Если параметр timeout опущен, функция блокируется до тех пор, пока не будет готов хотя бы один файловый дескриптор. Нулевое значение времени ожидания определяет опрос и никогда не блокируется.
Возвращаемое значение представляет собой тройку списков объектов, которые готовы: подмножества первых трех аргументов. Когда время ожидания истекает, а файловый дескриптор не становится готовым, возвращаются три пустых списка.
Среди допустимых типов объектов в iterables - Python file objects (например,
sys.stdinили объекты, возвращаемыеopen()илиos.popen()), объекты сокетов, возвращаемыеsocket.socket(). Вы также можете сами определить класс wrapper, если у него есть соответствующий методfileno()(который действительно возвращает файловый дескриптор, а не просто случайное целое число).Примечание
Файловые объекты в Windows неприемлемы, но сокеты допустимы. В Windows базовая функция
select()предоставляется библиотекой WinSock и не обрабатывает файловые дескрипторы, которые не исходят из WinSock.Изменено в версии 3.5: Функция теперь отключается с пересчитанным временем ожидания при прерывании сигналом, за исключением случаев, когда обработчик сигнала вызывает исключение (см. PEP 475 для объяснения), вместо того, чтобы вызывать
InterruptedError.
- select.PIPE_BUF¶
Минимальное количество байт, которое может быть записано в канал без блокировки, когда канал был сообщен как готовый к записи с помощью
select(),poll()или другого интерфейса в этом модуле. Это не относится к другим файловым объектам, таким как сокеты.POSIX гарантирует, что это значение будет не менее 512.
Availability: Unix
Добавлено в версии 3.2.
/dev/poll Объекты опроса¶
Solaris и производные от него имеют значение /dev/poll. В то время как select() равно O(самый высокий файловый дескриптор), а poll() равно O(количество файловых дескрипторов), /dev/poll равно O(активные файловые дескрипторы).
/dev/poll поведение очень близко к стандартному : объекту c:func:!poll.
- devpoll.close()¶
Закройте файловый дескриптор объекта опроса.
Добавлено в версии 3.4.
- devpoll.closed¶
Trueесли объект опроса закрыт.Добавлено в версии 3.4.
- devpoll.fileno()¶
Возвращает номер файлового дескриптора объекта опроса.
Добавлено в версии 3.4.
- devpoll.register(fd[, eventmask])¶
Зарегистрируйте файловый дескриптор с помощью объекта опроса. При последующих вызовах метода
poll()будет проверяться, есть ли в файловом дескрипторе какие-либо ожидающие события ввода-вывода. fd может быть либо целым числом, либо объектом с методомfileno(), который возвращает целое число. Файловые объекты реализуютfileno(), поэтому их также можно использовать в качестве аргумента.eventmask - это необязательная битовая маска, описывающая тип событий, которые вы хотите проверить. Константы те же, что и в случае с
poll()object. Значением по умолчанию является комбинация констант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
маска события
Постоянный
Значение
EPOLLINДоступно для чтения
EPOLLOUTДоступно для записи
EPOLLPRIСрочные данные для чтения
EPOLLERRВ assoc. fd произошла ошибка.
EPOLLHUPЗависание произошло на доц. фд
EPOLLETУстановите поведение триггера Edge, по умолчанию используется поведение триггера Level
EPOLLONESHOTУстановите режим одноразового использования. После извлечения одного события функция fd отключается
EPOLLEXCLUSIVEАктивировать только один объект epoll, когда в связанном fd происходит событие. По умолчанию (если этот флаг не установлен) активируются все объекты epoll, проводящие опрос в fd.
EPOLLRDHUPОдноранговый узел потокового сокета закрыл соединение или завершил запись половины соединения.
EPOLLRDNORMЭквивалентно
EPOLLIN
EPOLLRDBANDПриоритетный диапазон данных может быть считан.
EPOLLWRNORMЭквивалентно
EPOLLOUT
EPOLLWRBANDМогут быть записаны приоритетные данные.
EPOLLMSGИгнорируется.
Добавлено в версии 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)¶
Дождитесь событий. время ожидания в секундах (плавающее значение)
Изменено в версии 3.5: Функция теперь отключается с пересчитанным временем ожидания при прерывании сигналом, за исключением случаев, когда обработчик сигнала вызывает исключение (см. PEP 475 для объяснения), вместо того, чтобы вызывать
InterruptedError.
Объекты опроса¶
Системный вызов poll(), поддерживаемый большинством систем Unix, обеспечивает лучшую масштабируемость для сетевых серверов, обслуживающих очень много клиентов одновременно. poll() лучше масштабируется, поскольку для системного вызова требуется только перечислить интересующие файловые дескрипторы, в то время как select() создает растровое изображение, включает биты для интересующих fds, а затем все растровое изображение снова должно быть линейно отсканировано. 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с ошибкойENOENT.
- 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.closed¶
Trueесли объект очереди закрыт.
- kqueue.fileno()¶
Возвращает номер файлового дескриптора элемента управления fd.
- kqueue.fromfd(fd)¶
Создайте объект очереди из заданного файлового дескриптора.
- kqueue.control(changelist, max_events[, timeout]) eventlist¶
Низкоуровневый интерфейс с kevent
список изменений должен состоять из повторяющихся объектов kevent или
Noneзначение max_events должно быть равно 0 или положительному целому числу
время ожидания в секундах (возможно с плавающим значением); значение по умолчанию
None, ожидание бесконечно
Изменено в версии 3.5: Функция теперь отключается с пересчитанным временем ожидания при прерывании сигналом, за исключением случаев, когда обработчик сигнала вызывает исключение (см. PEP 475 для объяснения), вместо того, чтобы вызывать
InterruptedError.
Невидимые объекты¶
https://man.freebsd.org/cgi/man.cgi?query=kqueue&sektion=2
- kevent.ident¶
Значение, используемое для идентификации события. Интерпретация зависит от фильтра, но обычно это файловый дескриптор. В конструкторе ident может быть либо int, либо объектом с методом
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флаги фильтрации (недоступны в Mac OS):Постоянный
Значение
KQ_NOTE_LINKUPсвязь установлена
KQ_NOTE_LINKDOWNсвязь прервана
KQ_NOTE_LINKINVсостояние ссылки недопустимо
- kevent.data¶
Фильтруйте конкретные данные.
- kevent.udata¶
Значение, определяемое пользователем.