select
— Ожидание завершения ввода/вывода¶
Этот модуль предоставляет доступ к функциям select()
и poll()
, доступным в большинстве операционных систем, devpoll()
- в Solaris и производных, epoll()
- в Linux 2.5+ и kqueue()
- в большинстве BSD. Обратите внимание, что в Windows он работает только для сокетов; в других операционных системах он работает и для других типов файлов (в частности, в Unix он работает для pipes). Его нельзя использовать для обычных файлов, чтобы определить, вырос ли файл с момента последнего чтения.
Примечание
Модуль selectors
обеспечивает высокоуровневое и эффективное мультиплексирование ввода/вывода, построенное на примитивах модуля select
. Пользователям рекомендуется использовать вместо него модуль selectors
, если они не хотят точно контролировать используемые примитивы на уровне ОС.
Модуль определяет следующее:
-
select.
devpoll
()¶ (Поддерживается только на Solaris и производных.) Возвращает объект опроса
/dev/poll
; см. раздел /dev/poll Опрос объектов ниже о методах, поддерживаемых объектами devpoll.Объекты
devpoll()
связаны с количеством файловых дескрипторов, разрешенных на момент инстанцирования. Если ваша программа уменьшит это значение,devpoll()
завершится неудачей. Если ваша программа увеличит это значение,devpoll()
может вернуть неполный список активных файловых дескрипторов.Новый дескриптор файла - non-inheritable.
Добавлено в версии 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: Добавлен параметр флаги.
Изменено в версии 3.4: Добавлена поддержка оператора
with
. Новый дескриптор файла теперь не наследуется.Не рекомендуется, начиная с версии 3.4: Параметр флаги. По умолчанию сейчас используется
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()
, возвращающим такое целое число:список: дождаться готовности к чтению
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
Добавлено в версии 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
Постоянная
Значение
EPOLLIN
Доступно для чтения
EPOLLOUT
Доступно для записи
EPOLLPRI
Срочные данные для чтения
EPOLLERR
Возникло состояние ошибки на ассоц. fd
EPOLLHUP
Повесьте трубку, если она была на заднем плане.
EPOLLET
Установите поведение триггера по краю, по умолчанию используется поведение триггера по уровню
EPOLLONESHOT
Установите однократное поведение. После извлечения одного события fd внутренне отключается.
EPOLLEXCLUSIVE
Пробуждать только один объект epoll, когда на связанном с ним fd происходит событие. По умолчанию (если этот флаг не установлен) пробуждаются все объекты epoll, опрашивающие fd.
EPOLLRDHUP
Пир потокового сокета закрыл соединение или отключил пишущую половину соединения.
EPOLLRDNORM
Эквивалентно
EPOLLIN
EPOLLRDBAND
Приоритетная полоса данных может быть считана.
EPOLLWRNORM
Эквивалентно
EPOLLOUT
EPOLLWRBAND
Приоритетные данные могут быть записаны.
EPOLLMSG
Игнорируется.
Добавлено в версии 3.6:
EPOLLEXCLUSIVE
был добавлен. Он поддерживается только ядром Linux Kernel 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
с errnoENOENT
.
-
poll.
unregister
(fd)¶ Удаление дескриптора файла, отслеживаемого объектом опроса. Как и метод
register()
, fd может быть целым числом или объектом с методомfileno()
, который возвращает целое число.Изменяет уже зарегистрированный fd. Это имеет тот же эффект, что и
KeyError
. Попытка модифицировать дескриптор файла, который никогда не был зарегистрирован, вызывает исключение с errno .
-
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
changelist должен быть итерабельным объектом kevent или
None
.max_events должно быть 0 или целое положительное число
таймаут в секундах (возможны плавающие значения); по умолчанию
None
, чтобы ждать вечно
Изменено в версии 3.5: Теперь при прерывании сигналом функция повторяется с пересчитанным таймаутом, за исключением случаев, когда обработчик сигнала вызывает исключение (см. PEP 475 для обоснования), вместо того, чтобы вызывать
InterruptedError
.
Объекты Кевента¶
https://www.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
¶ Значение, определяемое пользователем.