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