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 Polling Objects ниже для методов, поддерживаемых объектами 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.См. раздел Edge and Level Trigger Polling (epoll) Objects ниже для методов, поддерживаемых объектами epolling.
Объекты
epollподдерживают протокол управления контекстом: при использовании в оператореwithновый дескриптор файла автоматически закрывается в конце блока.Новый дескриптор файла является непередаваемым.
Изменено в версии 3.3: Добавлен параметр flags.
Изменено в версии 3.4: Добавлена поддержка оператора
with. Новый дескриптор файла теперь непередаваемый.Устарело начиная с версии 3.4: Параметр flags.
select.EPOLL_CLOEXECиспользуется по умолчанию. Используйтеos.set_inheritable(), чтобы сделать дескриптор файла передаваемым.
-
select.poll() -
(Не поддерживается всеми операционными системами.) Возвращает объект опроса, который поддерживает регистрацию и отмену регистрации дескрипторов файлов, а затем опрос их на наличие событий ввода-вывода; см. раздел Polling Objects ниже для методов, поддерживаемых объектами опроса.
-
select.kqueue() -
(Поддерживается только в BSD.) Возвращает объект очереди ядра; см. раздел Kqueue Objects ниже для методов, поддерживаемых объектами kqueue.
Новый дескриптор файла является непередаваемым.
Изменено в версии 3.4: Новый дескриптор файла теперь непередаваемый.
-
select.kevent(ident, filter=KQ_FILTER_READ, flags=KQ_EV_ADD, fflags=0, data=0, udata=0) -
(Поддерживается только в BSD.) Возвращает объект события ядра; см. раздел Kevent Objects ниже для методов, поддерживаемых объектами 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.
18.3.1. /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.
18.3.2. Объекты опроса с триггерами уровня и края (epoll)
http://linux.die.net/man/4/epoll
eventmask
Константа | Значение |
|---|---|
| Доступно для чтения |
| Доступно для записи |
| Неотложные данные для чтения |
| Произошла ошибка на связанном fd |
| Произошла отвязка на связанном fd |
| Установить поведение с триггером края, по умолчанию используется поведение с триггером уровня |
| Установить одноразовое поведение. После извлечения одного события fd внутренне отключается |
| Разбудить только один объект epoll, когда у связанного fd есть событие. По умолчанию (если этот флаг не установлен) разбудить все объекты epoll, опрашивающие fd. |
| Сокет потокового типа, удаленный конечный пункт закрыл соединение или остановил запись на половине соединения. |
| Эквивалентно |
| Данные с приоритетом могут быть прочитаны. |
| Эквивалентно |
| Данные с приоритетом могут быть записаны. |
| Игнорируется. |
-
epoll.close() -
Закрыть дескриптор управления объекта epoll.
-
epoll.closed -
True, если объект epoll закрыт.
-
epoll.fileno() -
Возвращает номер дескриптора файла дескриптора управления.
-
epoll.fromfd(fd) -
Создать объект epoll из заданного дескриптора файла.
-
epoll.register(fd[, eventmask]) -
Зарегистрировать дескриптор файла в объекте epoll.
-
epoll.modify(fd, eventmask) -
Изменить зарегистрированный дескриптор файла.
-
epoll.unregister(fd) -
Удалить зарегистрированный дескриптор файла из объекта epoll.
-
epoll.poll(timeout=-1, maxevents=-1) -
Ожидать событий. timeout в секундах (float)
Изменено в версии 3.5: Функция теперь повторяется с пересчитанным таймаутом при прерывании сигналом, за исключением случаев, когда обработчик сигнала вызывает исключение (см. PEP 475 для обоснования), вместо того, чтобы поднимать
InterruptedError.
18.3.3. Объекты опроса
Системный вызов 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.
18.3.4. Объекты Kqueue
-
kqueue.close() -
Закрыть дескриптор управляющего файла объекта kqueue.
-
kqueue.closed -
True, если объект kqueue закрыт.
-
kqueue.fileno() -
Возвращает номер дескриптора файла управляющего файла.
-
kqueue.fromfd(fd) -
Создаёт объект kqueue из заданного дескриптора файла.
-
kqueue.control(changelist, max_events[, timeout=None]) → eventlist -
Интерфейс низкого уровня к kevent
- changelist должен быть итерируемым объектом kevent или
None - max_events должен быть 0 или положительным целым числом
- timeout в секундах (допускаются числа с плавающей точкой)
Изменено в версии 3.5: Функция теперь повторяет попытку с пересчитанным таймаутом при прерывании сигналом, за исключением случаев, когда обработчик сигнала вызывает исключение (см. PEP 475 для обоснования), вместо повышения
InterruptedError. - changelist должен быть итерируемым объектом kevent или
18.3.5. Объекты 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и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(не доступны в 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.6/library/select.html