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¶
Значение, определяемое пользователем.