select — Ожидание завершения ввода-вывода
Этот модуль предоставляет доступ к функциям select() и poll(), доступным в большинстве операционных систем, devpoll(), доступным на Solaris и производных системах, epoll(), доступным в Linux 2.5+ и kqueue(), доступным в большинстве BSD. Обратите внимание, что в Windows он работает только для сокетов; в других операционных системах он также работает для других типов файлов (в частности, в Unix он работает с каналами). Он не может использоваться с обычными файлами для определения, вырос ли файл с момента последнего чтения.
Примечание
Модуль selectors позволяет выполнять высокоуровневую и эффективную многопоточную обработку ввода-вывода, основанную на примитивах модуля select. Пользователям рекомендуется использовать модуль selectors, если только они не хотят иметь точный контроль над используемыми примитивами на уровне ОС.
Доступность: не Emscripten, не WASI.
Этот модуль не работает или недоступен на платформах WebAssembly wasm32-emscripten и wasm32-wasi. Подробную информацию см. в разделе Платформы WebAssembly.
Модуль определяет следующее:
-
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.) Возвращает объект события ядра; см. раздел Объекты kevent ниже для методов, поддерживаемых объектами kevent.
-
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 внутренне отключается |
| Разбудить только один объект epoll, когда у ассоциированного fd есть событие. По умолчанию (если этот флаг не установлен) разбуждаются все объекты epoll, опрашивающие fd. |
| Клиент закрыл соединение или завершил запись половины соединения. |
| Эквивалентно |
| Можно прочитать данные приоритетного канала. |
| Эквивалентно |
| Данные приоритетного канала могут быть записаны. |
| Игнорируется. |
Добавлена в версии 3.6: EPOLLEXCLUSIVE была добавлена. Она поддерживается только ядром Linux 4.5 и новее.
-
epoll.close() -
Закрыть управляющий дескриптор файла объекта epoll.
-
epoll.closed -
True, если объект epoll закрыт.
-
epoll.fileno() -
Возвращает номер дескриптора управляющего файла.
-
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) -
Ожидание событий. timeout в секундах (float)
Изменено в версии 3.5: Функция теперь повторно выполняется с пересчитанным таймаутом при прерывании сигналом, за исключением случаев, когда обработчик сигнала вызывает исключение (см. PEP 475 для обоснования), вместо повышения
InterruptedError.
Объекты опроса
Системный вызов poll(), поддерживаемый в большинстве систем Unix, обеспечивает лучшую масштабируемость для сетевых серверов, обслуживающих множество клиентов одновременно. poll() масштабируется лучше, потому что системный вызов требует только перечисления интересующих дескрипторов файлов, в то время как select() создаёт битовую карту, включает биты для интересующих дескрипторов файлов, а затем всю битовую карту необходимо снова линейно сканировать. 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() -
Возвращает номер дескриптора файла файла управления.
-
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://man.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Отслеживание событий на сетевом устройстве [не доступно на 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(не доступно на macOS):Константа
Значение
KQ_NOTE_LINKUPсоединение установлено
KQ_NOTE_LINKDOWNсоединение разорвано
KQ_NOTE_LINKINVсостояние соединения недопустимо
-
kevent.data -
Данные, специфичные для фильтра.
-
kevent.udata -
Пользовательское значение.
© 2001–2024 Python Software Foundation
Licensed under the PSF License.
https://docs.python.org/3.12/library/select.html