select — Ожидание завершения ввода-вывода
Этот модуль предоставляет доступ к функциям select() и poll(), доступным в большинстве операционных систем, epoll(), доступной на Linux 2.5+ и kqueue(), доступной на большинстве BSD. Обратите внимание, что в Windows он работает только для сокетов; в других операционных системах он также работает с другими типами файлов (в частности, в Unix он работает с каналами). Его нельзя использовать с обычными файлами для определения, увеличился ли размер файла с момента последнего чтения.
Модуль определяет следующее:
-
exception select.error -
Исключение, генерируемое при возникновении ошибки. Сопровождающее значение представляет собой пару, содержащую числовой код ошибки из
errnoи соответствующую строку, как если бы она была напечатана функцией Cperror().
-
select.epoll([sizehint=-1]) -
(Поддерживается только на Linux 2.5.44 и новее.) Возвращает объект порогового опроса, который можно использовать как интерфейс с пороговым или уровневым триггером для событий ввода-вывода; см. раздел Объекты порогового и уровневого опроса (epoll) ниже, чтобы узнать о методах, поддерживаемых объектами epoll.
Новая версия 2.6.
-
select.poll() -
(Не поддерживается во всех операционных системах.) Возвращает объект опроса, который поддерживает регистрацию и отмену регистрации дескрипторов файлов, а затем опрос их на наличие событий ввода-вывода; см. раздел Объекты опроса ниже, чтобы узнать о методах, поддерживаемых объектами опроса.
-
select.kqueue() -
(Поддерживается только на BSD.) Возвращает объект очереди ядра; см. раздел Объекты kqueue ниже, чтобы узнать о методах, поддерживаемых объектами kqueue.
Новая версия 2.6.
-
select.kevent(ident, filter=KQ_FILTER_READ, flags=KQ_EV_ADD, fflags=0, data=0, udata=0) -
(Поддерживается только на BSD.) Возвращает объект события ядра; см. раздел Объекты kevent ниже, чтобы узнать о методах, поддерживаемых объектами kevent.
Новая версия 2.6.
-
select.select(rlist, wlist, xlist[, timeout]) -
Это простой интерфейс к системному вызову Unix
select(). Первые три аргумента — это последовательности «объектов ожидания»: либо целые числа, представляющие дескрипторы файлов, либо объекты с безаргументным методом с именемfileno(), возвращающим такое целое число:- rlist: ожидать готовности к чтению
- wlist: ожидать готовности к записи
- xlist: ожидать «исключительного условия» (см. страницу руководства, что ваша система считает таким условием)
Разрешены пустые последовательности, но принятие трех пустых последовательностей зависит от платформы. (Известно, что это работает в Unix, но не в Windows.) Необязательный аргумент timeout задаёт время ожидания как число с плавающей точкой в секундах. Если аргумент timeout опущен, функция блокируется до тех пор, пока хотя бы один дескриптор файла не станет готов. Значение time-out равное нулю задаёт опрос и никогда не блокируется.
Значение возврата — тройка списков объектов, которые готовы: подмножества первых трех аргументов. Когда время ожидания истекло, а дескриптор файла не стал готовым, возвращаются три пустых списка.
К допустимым типам объектов в последовательностях относятся объекты Python-файлов (например,
sys.stdinили объекты, возвращаемыеopen()илиos.popen()), объекты сокетов, возвращаемыеsocket.socket(). Вы также можете определить собственный класс-обёртку, при условии, что он имеет соответствующий методfileno()(который действительно возвращает дескриптор файла, а не просто случайное целое число).Примечание
Объекты файлов в Windows недопустимы, но сокеты — да. В Windows подчинённая
select()функция предоставляется библиотекой WinSock и не обрабатывает дескрипторы файлов, которые не происходят из WinSock.
-
select.PIPE_BUF -
Файлы, которые сообщаются как готовые к записи методами
select(),poll()или аналогичными интерфейсами в этом модуле, гарантированно не блокируются при записи доPIPE_BUFбайт. Это значение гарантируется POSIX, чтобы оно было как минимум 512. Доступность: Unix.Новая версия 2.7.
1. Объекты порогового и уровневого опроса (epoll)
http://linux.die.net/man/4/epoll
eventmask
Константа | Значение |
|---|---|
| Доступно для чтения |
| Доступно для записи |
| Данные срочности для чтения |
| Произошло условие ошибки в assoc. fd |
| Произошло отключение в assoc. fd |
| Установить поведение Edge Trigger, по умолчанию используется поведение Level Trigger |
| Установить однократное поведение. После извлечения одного события fd внутренне отключается |
| Эквивалентно |
| Можно прочитать данные полосы приоритета. |
| Эквивалентно |
| Данные приоритета могут быть записаны. |
| Игнорируется. |
-
epoll.close() -
Закрыть дескриптор управления файла объекта epoll.
-
epoll.fileno() -
Возвращает номер дескриптора файла дескриптора управления.
-
epoll.fromfd(fd) -
Создать объект epoll из данного дескриптора файла.
-
epoll.register(fd[, eventmask]) -
Зарегистрировать дескриптор fd в объекте epoll.
Примечание
Регистрация дескриптора файла, который уже зарегистрирован, вызывает IOError — в отличие от регистрации в Объектах опроса.
-
epoll.modify(fd, eventmask) -
Изменить зарегистрированный дескриптор файла.
-
epoll.unregister(fd) -
Удалить зарегистрированный дескриптор файла из объекта epoll.
-
epoll.poll([timeout=-1[, maxevents=-1]]) -
Ожидать событий. timeout в секундах (float)
2. Объекты опроса
Системный вызов 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Отключение
POLLNVALНеверный запрос: дескриптор не открыт
Регистрация дескриптора файла, который уже зарегистрирован, не является ошибкой и имеет тот же эффект, что и регистрация дескриптора ровно один раз.
-
poll.modify(fd, eventmask) -
Изменяет уже зарегистрированный дескриптор файла. Это имеет тот же эффект, что и
register(fd, eventmask). Попытка изменить дескриптор файла, который никогда не был зарегистрирован, вызывает исключениеIOErrorс errnoENOENT.Новое в версии 2.6.
-
poll.unregister(fd) -
Удаляет дескриптор файла, отслеживаемый объектом опроса. Подобно методу
register(), fd может быть целым числом или объектом с методомfileno(), возвращающим целое число.Попытка удалить дескриптор файла, который никогда не был зарегистрирован, вызывает исключение
KeyError.
-
poll.poll([timeout]) -
Опрашивает набор зарегистрированных дескрипторов файлов и возвращает, возможно, пустой список, содержащий
(fd, event)кортежи 2-х элементов для дескрипторов, у которых есть события или ошибки для отчёта. fd — дескриптор файла, а event — битовая маска с установленными битами для отчётных событий для этого дескриптора —POLLINдля ожидания ввода,POLLOUT, чтобы указать, что к дескриптору можно обратиться для записи, и так далее. Пустой список указывает на то, что вызов закончился таймаутом и у дескрипторов файлов не было событий для отчёта. Если указан timeout, он определяет продолжительность времени в миллисекундах, которое система будет ожидать событий перед возвратом. Если timeout опущен, отрицателен или равенNone, вызов будет блокироваться, пока не произойдёт событие для этого объекта опроса.
3. Объекты Kqueue
-
kqueue.close() -
Закрывает дескриптор управления файла объекта kqueue.
-
kqueue.fileno() -
Возвращает номер дескриптора файла файла управления.
-
kqueue.fromfd(fd) -
Создаёт объект kqueue из заданного дескриптора файла.
-
kqueue.control(changelist, max_events[, timeout]) → eventlist -
Интерфейс низкого уровня к kevent
- changelist должен быть итерируемым объектом kevent или
None - max_events должен быть 0 или положительным целым числом
- timeout в секундах (возможны числа с плавающей точкой); значение по умолчанию —
None, для ожидания бесконечно
- changelist должен быть итерируемым объектом kevent или
4. Объекты 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/2.7/library/select.html