select
— Ожидание завершения ввода/вывода¶
Этот модуль предоставляет доступ к функциям select()
и poll()
, доступным в большинстве операционных систем, devpoll()
- в Solaris и производных, epoll()
- в Linux 2.5+ и kqueue()
- в большинстве BSD. Обратите внимание, что в Windows она работает только для сокетов; в других операционных системах она работает и для других типов файлов (в частности, в Unix она работает для труб). Его нельзя использовать для обычных файлов, чтобы определить, увеличился ли файл с момента последнего чтения.
Примечание
Модуль selectors
обеспечивает высокоуровневое и эффективное мультиплексирование ввода-вывода, построенное на примитивах модуля select
. Пользователям рекомендуется использовать вместо него модуль selectors
, если только они не хотят получить точный контроль над используемыми примитивами на уровне ОС.
Availability: не WASI.
Этот модуль не работает или недоступен на WebAssembly. Дополнительную информацию см. в разделе Платформы WebAssembly.
Модуль определяет следующее:
- select.devpoll()¶
(Поддерживается только в Solaris и производных.) Возвращает объект
/dev/poll
опроса; методы, поддерживаемые объектами devpoll, см. в разделе /dev/poll Опрашиваемые объекты ниже.Объекты
devpoll()
связаны с количеством файловых дескрипторов, разрешенных на момент инстанцирования. Если ваша программа уменьшит это значение,devpoll()
завершится неудачей. Если программа увеличит это значение,devpoll()
может вернуть неполный список активных файловых дескрипторов.Новый дескриптор файла - non-inheritable.
Added in version 3.3.
Изменено в версии 3.4: Новый дескриптор файла теперь не наследуется.
- select.epoll(sizehint=-1, flags=0)¶
(Поддерживается только в Linux 2.5.44 и новее.) Возвращает объект опроса края, который можно использовать в качестве интерфейса Edge или Level Triggered для событий ввода/вывода.
sizehint информирует epoll об ожидаемом количестве регистрируемых событий. Значение должно быть положительным, или
-1
, чтобы использовать значение по умолчанию. Он используется только в старых системах, гдеepoll_create1()
недоступен; в противном случае он не имеет никакого эффекта (хотя его значение все равно проверяется).flags является устаревшим и полностью игнорируется. Тем не менее, если он указан, его значение должно быть
0
илиselect.EPOLL_CLOEXEC
, иначе будет получено значениеOSError
.Методы, поддерживаемые объектами epolling, см. в разделе Опрос триггеров по фронту и уровню (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, см. в разделе Объекты Kevent ниже.
- select.select(rlist, wlist, xlist[, timeout])¶
Это прямой интерфейс к системному вызову Unix
select()
. Первые три аргумента являются итерациями «ожидающих объектов»: либо целых чисел, представляющих дескрипторы файлов, либо объектов с беспараметрическим методомfileno()
, возвращающим такое целое число:список: дождаться готовности к чтению
wlist: ждать, пока не будет готово к записи
xlist: ожидание «исключительного условия» (см. страницу руководства о том, что ваша система считает таким условием)
Пустые итерации разрешены, но прием трех пустых итераций зависит от платформы. (Известно, что она работает на Unix, но не на Windows.) Необязательный аргумент timeout задает тайм-аут в виде числа с плавающей точкой в секундах. Если аргумент timeout опущен, функция блокируется до тех пор, пока не будет готов хотя бы один файловый дескриптор. Значение тайм-аута, равное нулю, определяет опрос и никогда не блокирует.
Возвращаемое значение - тройка списков объектов, которые готовы: подмножества первых трех аргументов. Если по истечении тайм-аута ни один файловый дескриптор не будет готов, возвращаются три пустых списка.
Среди допустимых типов объектов в итерациях - 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
Added in version 3.2.
/dev/poll
Опрашиваемые объекты¶
Solaris и производные имеют значение /dev/poll
. В то время как select()
- это O(самый высокий файловый дескриптор), а poll()
- это O(количество файловых дескрипторов), /dev/poll
- это O(активные файловые дескрипторы).
Поведение /dev/poll
очень близко к поведению стандартного объекта poll()
.
- devpoll.close()¶
Закрывает дескриптор файла объекта опроса.
Added in version 3.4.
- devpoll.closed¶
True
, если объект опроса закрыт.Added in version 3.4.
- devpoll.fileno()¶
Возвращает номер файлового дескриптора объекта опроса.
Added in version 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.
Постоянно
Значение
EPOLLIN
Доступно для чтения
EPOLLOUT
Доступно для записи
EPOLLPRI
Срочные данные для чтения
EPOLLERR
Ошибка произошла при выполнении assoc. fd
EPOLLHUP
Повесьте трубку, если вы не знаете, что делать.
EPOLLET
Установите поведение Edge Trigger, по умолчанию - Level Trigger.
EPOLLONESHOT
Установите однократное поведение. После извлечения одного события fd внутренне отключается
EPOLLEXCLUSIVE
Будить только один объект epoll, когда на связанном с ним fd происходит событие. По умолчанию (если этот флаг не установлен) пробуждаются все объекты epoll, опрашиваемые на fd.
EPOLLRDHUP
Пир потокового сокета закрыл соединение или отключил пишущую половину соединения.
EPOLLRDNORM
Эквивалент
EPOLLIN
EPOLLRDBAND
Приоритетная полоса данных может быть прочитана.
EPOLLWRNORM
Эквивалент
EPOLLOUT
EPOLLWRBAND
Приоритетные данные могут быть записаны.
EPOLLMSG
Игнорируется.
Added in version 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)¶
Ожидание событий. таймаут в секундах (float)
Изменено в версии 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
с 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()¶
Возвращает номер файлового дескриптора элемента управления fd.
- kqueue.fromfd(fd)¶
Создание объекта kqueue из заданного дескриптора файла.
- kqueue.control(changelist, max_events[, timeout]) eventlist ¶
Низкоуровневый интерфейс к kevent
Список изменений должен быть итерируемым объектом kevent или
None
.max_events должно быть 0 или целое положительное число
таймаут в секундах (можно плавающие значения); по умолчанию
None
, чтобы ждать вечно
Изменено в версии 3.5: Теперь при прерывании сигнала функция повторяется с пересчитанным таймаутом, за исключением случаев, когда обработчик сигнала вызывает исключение (см. обоснование в PEP 475), вместо того чтобы вызывать
InterruptedError
.
Объекты Kevent¶
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
Disablesevent
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¶
Значение, определяемое пользователем.