select — Ожидание завершения операций ввода-вывода
Этот модуль предоставляет доступ к функциям select() и poll(), доступным в большинстве операционных систем, devpoll() доступным в Solaris и его производных, epoll() доступным в Linux 2.5+ и kqueue() доступным в большинстве систем BSD. Обратите внимание, что в Windows он работает только для сокетов; в других операционных системах он также работает с другими типами файлов (в частности, в Unix он работает с каналами). Он не может использоваться с обычными файлами для определения, увеличился ли размер файла с момента последнего чтения.
Примечание
Модуль selectors позволяет осуществлять высокоуровневую и эффективную многопоточную обработку операций ввода-вывода, основанную на примитивах модуля select. Пользователям рекомендуется использовать модуль selectors вместо этого, если только не требуется точный контроль над используемыми операционными примитивами.
Модуль определяет следующее:
-
exception select.error -
Устаревшее алиас для
OSError.
-
select.devpoll() -
(Поддерживается только в Solaris и его производных.) Возвращает объект опроса
/dev/poll; см. раздел Объекты опроса /dev/poll ниже, чтобы ознакомиться с методами, поддерживаемыми объектами devpoll.Объекты
devpoll()связаны с количеством дескрипторов файлов, разрешенных на момент создания экземпляра. Если ваша программа уменьшит это значение,devpoll()завершится с ошибкой. Если ваша программа увеличит это значение,devpoll()может вернуть неполный список активных дескрипторов файлов.Новый дескриптор файла является непередаваемым.
Добавлен в версии 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) ниже для методов, поддерживаемых объектами epolling.
Объекты
epollподдерживают протокол управления контекстом: при использовании в инструкцииwithновый дескриптор файла автоматически закрывается в конце блока.Новый дескриптор файла является непередаваемым.
Изменено в версии 3.3: Добавлен параметр flags.
Изменено в версии 3.4: Поддержка инструкции
withбыла добавлена. Новый дескриптор файла теперь непередаваемый.Устаревшее с версии 3.4: Параметр flags.
select.EPOLL_CLOEXECиспользуется по умолчанию. Используйтеos.set_inheritable()для изменения переносимости дескриптора файла.
-
select.poll() -
(Не поддерживается во всех операционных системах.) Возвращает объект опроса, который поддерживает регистрацию и отмену регистрации дескрипторов файлов и последующий опрос их на наличие событий ввода-вывода; см. раздел Объекты опроса ниже для методов, поддерживаемых объектами опроса.
-
select.kqueue() -
(Поддерживается только в BSD.) Возвращает объект очереди ядра; см. раздел Объекты kqueue ниже для методов, поддерживаемых объектами kqueue.
Новый дескриптор файла является непередаваемым.
Изменено в версии 3.4: Новый дескриптор файла теперь непередаваемый.
-
select.kevent(ident, filter=KQ_FILTER_READ, flags=KQ_EV_ADD, fflags=0, data=0, udata=0) -
(Поддерживается только в BSD.) Возвращает объект события ядра; см. раздел Объекты кеvent ниже для методов, поддерживаемых объектами кеvent.
-
select.select(rlist, wlist, xlist[, timeout]) -
Это простой интерфейс к системному вызову Unix
select(). Первые три аргумента — это итерируемые «объекты ожидания»: либо целые числа, представляющие дескрипторы файлов, либо объекты с безаргументным методом с именемfileno(), возвращающим такое целое число:- rlist: ожидать готовности к чтению
- wlist: ожидать готовности к записи
- xlist: ожидать «исключительного состояния» (см. руководство по тому, что ваша система считает таким состоянием)
Разрешены пустые итерируемые объекты, но прием трех пустых итерируемых объектов зависит от платформы. (Известно, что это работает в Unix, но не в Windows.) Необязательный аргумент timeout задаёт таймаут как число с плавающей запятой в секундах. Если аргумент timeout опущен, функция блокируется до тех пор, пока хотя бы один дескриптор файла не станет готовым. Значение таймаута 0 указывает на опрос и никогда не блокируется.
Значение возврата — тройка списков объектов, которые готовы: подмножества первых трёх аргументов. Если таймаут истекает, не достигнув готовности хотя бы одного дескриптора файла, возвращаются три пустых списка.
К приемлемым типам объектов в итерируемых списках относятся Python объекты файлов (например,
sys.stdin, или объекты, возвращаемыеopen()илиos.popen()), объекты сокетов, возвращаемыеsocket.socket(). Вы также можете определить свой собственный класс обёртки, если у него есть соответствующий методfileno()(который на самом деле возвращает дескриптор файла, а не просто произвольное целое число).Примечание
Объекты файлов в Windows неприемлемы, но сокеты — приемлемы. В Windows подлежащая функция
select()предоставляется библиотекой WinSock и не обрабатывает дескрипторы файлов, которые не происходят из WinSock.Изменено в версии 3.5: Теперь функция повторяется с пересчитанным таймаутом при прерывании сигналом, за исключением случаев, когда обработчик сигнала вызывает исключение (см. PEP 475 для обоснования), вместо вызова
InterruptedError.
-
select.PIPE_BUF -
Минимальное количество байтов, которые могут быть записаны без блокировки в канал, когда канал был объявлен готовым к записи функцией
select(),poll()или другим интерфейсом в этом модуле. Это не относится к другим типам объектов, похожих на файлы, таким как сокеты.Это значение гарантируется POSIX и должно быть не меньше 512.
Доступность: 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
Константа | Значение |
|---|---|
| Доступно для чтения |
| Доступно для записи |
| Неотложные данные для чтения |
| Возникла ошибка в ассоциированном fd |
| Произошла отвязка в ассоциированном fd |
| Установите поведение срабатывания по краю, по умолчанию — поведение срабатывания по уровню |
| Установите однократное поведение. После извлечения одного события fd внутренне отключается |
| Разбудить только один объект epoll, когда у связанного fd есть событие. По умолчанию (если этот флаг не установлен) разбудить все объекты epoll, которые опрашивают fd. |
| Клиент сокета потокового типа закрыл соединение или прекратил запись в соединение. |
| Эквивалентно |
| Данные высокой приоритетности могут быть прочитаны. |
| Эквивалентно |
| Данные высокой приоритетности могут быть записаны. |
| Игнорируется. |
Добавлено в версии 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.
-
epoll.poll(timeout=-1, maxevents=-1) -
Подождать событий. timeout в секундах (float)
Изменено в версии 3.5: Функция теперь повторно выполняется с пересчитанным таймаутом при прерывании сигналом, за исключением случая, когда обработчик сигнала вызывает исключение (см. PEP 475 для обоснования), вместо повышения
InterruptedError.
Объекты опроса
Системный вызов poll(), поддерживаемый на большинстве систем Unix, обеспечивает лучшую масштабируемость для серверов приложений сети, обслуживающих множество клиентов одновременно. poll() масштабируется лучше, потому что системный вызов требует только перечисления дескрипторов файлов, представляющих интерес, в то время как select() строит битовую карту, включает биты для fd, представляющих интерес, и затем после этого вся битовая карта должна быть просканирована линейно. 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
- changelist должен быть итерируемым объектом kevent или
None - max_events должен быть 0 или положительным целым числом
- timeout в секундах (допускаются числа с плавающей точкой); по умолчанию —
None, чтобы ждать бесконечно
Изменено в версии 3.5: Теперь функция повторно выполняется с пересчитанным временем ожидания при прерывании сигналом, за исключением случаев, когда обработчик сигнала вызывает исключение (см. PEP 475 для обоснования), вместо повышения
InterruptedError. - changelist должен быть итерируемым объектом kevent или
Объекты Kevent
https://www.freebsd.org/cgi/man.cgi?query=kqueue&sektion=2
-
kevent.ident -
Значение, используемое для идентификации события. Интерпретация зависит от фильтра, но обычно это дескриптор файла. В конструкторе ident может быть целое число или объект с методом
fileno(). kevent хранит целое число в памяти.
-
kevent.filter -
Название ядра фильтра.
Константа
Значение
KQ_FILTER_READПринимает дескриптор и возвращает, когда доступны данные для чтения
KQ_FILTER_WRITEПринимает дескриптор и возвращает, когда доступны данные для записи
KQ_FILTER_AIOЗапросы AIO
KQ_FILTER_VNODEВозвращает, когда происходит одно или несколько из запрошенных событий, наблюдаемых в fflag
KQ_FILTER_PROCНаблюдение за событиями для идентификатора процесса
KQ_FILTER_NETDEVНаблюдение за событиями на сетевом устройстве [недоступно в Mac OS X]
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и %%%CODE_BLOCK_168%%:Константа
Значение
KQ_NOTE_LOWATнижняя граница заполнения буфера сокета
Флаги фильтров %%%CODE_BLOCK_170%%:
Константа
Значение
KQ_NOTE_DELETEвызвана unlink()
KQ_NOTE_WRITEпроизошла запись
KQ_NOTE_EXTENDфайл был расширен
KQ_NOTE_ATTRIBбыло изменено свойство
KQ_NOTE_LINKизменилось число ссылок
KQ_NOTE_RENAMEфайл был переименован
KQ_NOTE_REVOKEдоступ к файлу был отозван
Флаги фильтров %%%CODE_BLOCK_178%%:
Константа
Значение
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 X):Константа
Значение
KQ_NOTE_LINKUPсоединение установлено
KQ_NOTE_LINKDOWNсоединение разорвано
KQ_NOTE_LINKINVсостояние соединения недействительно
-
kevent.data -
Данные специфичные для фильтра.
-
kevent.udata -
Пользовательское значение.
© 2001–2020 Python Software Foundation
Licensed under the PSF License.
https://docs.python.org/3.7/library/select.html