Содержание страницы
select – Ожидание завершения ввода-вывода¶select – Waiting for I/O completion
Этот модуль предоставляет доступ к функциям select() и poll(),
доступным в большинстве операционных систем, devpoll() – на
Solaris и производных, epoll() – на Linux 2.5+ и
kqueue() – на большинстве BSD.
Обратите внимание: в Windows он работает только с сокетами; в других ОС
он также работает с другими типами файлов (в частности, в Unix – с каналами).
Его нельзя использовать для обычных файлов, чтобы определить, увеличился ли файл
с момента последнего чтения.
Примечание
Модуль selectors предоставляет высокоуровневую и эффективную мультиплексацию ввода-вывода,
построенную на примитивах модуля select. Пользователям рекомендуется
использовать модуль selectors, если только им не требуется
точный контроль над используемыми низкоуровневыми примитивами ОС.
Доступность: не WASI.
Этот модуль не работает или недоступен на WebAssembly. Подробнее см. платформы WebAssembly.
Модуль определяет следующее:
- select.devpoll()¶
Возвращает объект
/dev/pollопроса; см. раздел Объекты опроса /dev/poll ниже для получения информации о методах, поддерживаемых объектами devpoll.Объекты
devpoll()привязаны к количеству файловых дескрипторов, разрешённых на момент создания. Если программа уменьшает это значение,devpoll()завершится ошибкой. Если программа увеличивает это значение,devpoll()может вернуть неполный список активных файловых дескрипторов.Новый файловый дескриптор является ненаследуемым.
Добавлено в версии 3.3.
Изменено в версии 3.4: Новый файловый дескриптор теперь не наследуется.
Доступность: Solaris.
- select.epoll(sizehint=-1, flags=0)¶
Возвращает объект опроса по фронту, который можно использовать как интерфейс с триггером по фронту или уровню для событий ввода-вывода.
Параметр sizehint сообщает epoll ожидаемое количество регистрируемых событий. Он должен быть положительным, либо
-1для использования значения по умолчанию. Он используется только в старых системах, гдеepoll_create1()недоступен; в противном случае он не имеет эффекта (хотя его значение по-прежнему проверяется).Параметр flags устарел и полностью игнорируется. Однако, если он указан, его значение должно быть
0илиselect.EPOLL_CLOEXEC, иначе возбуждаетсяOSError.См. раздел Объекты опроса с триггером по фронту и уровню (epoll) ниже для получения информации о методах, поддерживаемых объектами epoll.
Объекты
epollподдерживают протокол менеджера контекста: при использовании в инструкцииwithновый файловый дескриптор автоматически закрывается в конце блока.Новый файловый дескриптор является ненаследуемым.
Изменено в версии 3.3: Добавлен параметр flags.
Изменено в версии 3.4: Добавлена поддержка инструкции
with. Теперь новый файловый дескриптор является ненаследуемым.Устарело с версии 3.4: Параметр flags. Теперь по умолчанию используется
select.EPOLL_CLOEXEC. Используйтеos.set_inheritable(), чтобы сделать файловый дескриптор наследуемым.Доступность: Linux >= 2.5.44.
- select.poll()¶
Возвращает объект опроса, который поддерживает регистрацию и отмену регистрации файловых дескрипторов, а затем их опрос на предмет событий ввода-вывода; см. раздел Объекты опроса ниже для получения информации о методах, поддерживаемых объектами опроса.
Доступность: Unix.
- select.kqueue()¶
Возвращает объект очереди ядра; см. раздел Объекты Kqueue ниже для получения информации о методах, поддерживаемых объектами kqueue.
Новый файловый дескриптор является ненаследуемым.
Изменено в версии 3.4: Новый файловый дескриптор теперь не наследуется.
Доступность: BSD, macOS.
- select.kevent(ident, filter=KQ_FILTER_READ, flags=KQ_EV_ADD, fflags=0, data=0, udata=0)¶
Возвращает объект события ядра; см. раздел Объекты Kevent ниже для получения информации о методах, поддерживаемых объектами kevent.
Доступность: BSD, macOS.
- select.select(rlist, wlist, xlist, timeout=None)¶
Это простой интерфейс к системному вызову
select()Unix. Первые три аргумента – это итерируемые объекты «ожидаемых объектов»: целые числа, представляющие файловые дескрипторы, или объекты с методом без параметров с именемfileno(), возвращающим такое целое число:rlist: ожидать готовности к чтению
wlist: ожидать готовности к записи
xlist: ожидать «исключительного условия» (см. справочную страницу для того, что ваша система считает таким условием)
Пустые итерируемые объекты допускаются, но принятие трех пустых итерируемых объектов зависит от платформы. (Известно, что работает в Unix, но не в Windows.) Необязательный аргумент timeout задает тайм-аут как число с плавающей запятой в секундах. Когда аргумент timeout опущен или равен
None, функция блокируется, пока хотя бы один файловый дескриптор не будет готов. Значение тайм-аута, равное нулю, задает опрос и никогда не блокирует.Возвращаемое значение – тройка списков готовых объектов: подмножества первых трех аргументов. Когда тайм-аут истекает без готовности файлового дескриптора, возвращаются три пустых списка.
Среди допустимых типов объектов в итерируемых – файловые объекты 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 объекты опроса¶/dev/poll polling objects
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)для дескрипторов, у которых есть события или ошибки. fd – это файловый дескриптор, а event – битовая маска с установленными битами для сообщенных событий этого дескриптора:POLLIN– ожидание ввода,POLLOUT– указывает, что в дескриптор можно писать, и так далее. Пустой список означает, что вызов завершился по тайм-ауту и ни у одного файлового дескриптора не было событий. Если указан timeout, он задает время в миллисекундах, в течение которого система будет ждать событий перед возвратом. Если timeout опущен, равен -1 илиNone, вызов будет блокироваться до появления события для этого объекта poll.Изменено в версии 3.5: Функция теперь повторяется с пересчитанным тайм-аутом при прерывании сигналом, за исключением случая, когда обработчик сигнала вызывает исключение (см. PEP 475 для обоснования), вместо вызова
InterruptedError.
Объекты опроса с триггерами по переднему и уровневому фронту (epoll)¶Edge and level trigger polling (epoll) objects
https://linux.die.net/man/4/epoll
eventmask – это битовая маска, использующая следующие константы:
Константа
Значение
EPOLLINДоступен для чтения.
EPOLLOUTДоступен для записи.
EPOLLPRIСрочные данные для чтения.
EPOLLERRНа связанном fd произошла ошибка.
EPOLLHUPНа связанном fd произошел разрыв соединения.
EPOLLETУстанавливает поведение триггера по переднему фронту; по умолчанию – поведение триггера по уровню.
EPOLLONESHOTУстанавливает однократное поведение. После извлечения одного события файловый дескриптор внутренне отключается.
EPOLLEXCLUSIVEПробуждает только один объект epoll при событии на связанном fd. По умолчанию (если этот флаг не установлен) пробуждаются все объекты epoll, ожидающие на этом fd.
EPOLLRDHUPПотоковый сокет: удаленная сторона закрыла соединение или завершила записывающую половину соединения.
EPOLLRDNORMЭквивалентно
EPOLLIN
EPOLLRDBANDПолоса приоритетных данных доступна для чтения.
EPOLLWRNORMЭквивалентно
EPOLLOUT.
EPOLLWRBANDПриоритетные данные могут быть записаны.
EPOLLMSGИгнорируется.
EPOLLWAKEUPПредотвращает ожидание во время ожидания событий.
Добавлено в версии 3.6:
EPOLLEXCLUSIVEбыл добавлен. Поддерживается только ядром Linux 4.5 и новее.Добавлено в версии 3.14:
EPOLLWAKEUPбыл добавлен. Поддерживается только ядром Linux 3.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)¶
Изменяет зарегистрированный файловый дескриптор fd.
- epoll.unregister(fd)¶
Удаляет зарегистрированный файловый дескриптор из объекта epoll.
Изменено в версии 3.9: Метод больше не игнорирует ошибку
EBADF.
- epoll.poll(timeout=None, maxevents=-1)¶
Ожидает события. timeout в секундах (float)
Изменено в версии 3.5: Функция теперь повторяется с пересчитанным тайм-аутом при прерывании сигналом, за исключением случая, когда обработчик сигнала вызывает исключение (см. PEP 475 для обоснования), вместо вызова
InterruptedError.
Объекты опроса (polling)¶Polling objects
Системный вызов poll(), поддерживаемый в большинстве Unix-систем, обеспечивает лучшую масштабируемость для сетевых серверов, обслуживающих одновременно множество клиентов. poll() масштабируется лучше, поскольку системный вызов требует только перечисления интересующих файловых дескрипторов, тогда как select() строит битовую маску, устанавливает биты для интересующих fd, а затем всю битовую маску нужно снова линейно сканировать. select() имеет сложность O(наибольший файловый дескриптор), тогда как poll() – O(количество файловых дескрипторов).
- poll.register(fd[, eventmask])¶
Регистрирует файловый дескриптор в объекте опроса. Последующие вызовы метода
poll()будут проверять, есть ли у файлового дескриптора ожидающие события ввода-вывода. fd может быть целым числом или объектом с методомfileno(), возвращающим целое число. Файловые объекты реализуютfileno(), поэтому их тоже можно использовать в качестве аргумента.eventmask – необязательная битовая маска, описывающая типы событий для проверки. Может быть комбинацией констант
POLLIN,POLLPRIиPOLLOUT, описанных в таблице ниже. Если не указана, по умолчанию проверяются все три типа событий.Константа
Значение
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)кортежи из двух элементов для дескрипторов, по которым есть события или ошибки. fd – файловый дескриптор, а event – битовая маска с установленными битами для сообщаемых событий этого дескриптора:POLLINдля ожидания ввода,POLLOUTдля указания, что в дескриптор можно писать, и так далее. Пустой список означает, что вызов завершился по таймауту и ни у одного файлового дескриптора не было событий. Если указан timeout, он задает время ожидания в миллисекундах, в течение которого система будет ожидать события перед возвратом. Если timeout опущен, отрицателен или равенNone, вызов будет блокироваться до появления события для этого объекта опроса.Изменено в версии 3.5: Функция теперь повторяется с пересчитанным тайм-аутом при прерывании сигналом, за исключением случая, когда обработчик сигнала вызывает исключение (см. PEP 475 для обоснования), вместо вызова
InterruptedError.
Объекты Kqueue¶Kqueue objects
- kqueue.close()¶
Закрывает файловый дескриптор управления объекта kqueue.
- kqueue.closed¶
True, если объект kqueue закрыт.
- kqueue.fileno()¶
Возвращает номер файлового дескриптора управляющего fd.
- kqueue.fromfd(fd)¶
Создаёт объект kqueue из заданного файлового дескриптора.
- kqueue.control(changelist, max_events[, timeout]) eventlist¶
Низкоуровневый интерфейс к kevent
changelist должен быть итерируемым объектом, содержащим объекты kevent, или
Nonemax_events должен быть 0 или положительным целым числом
тайм-аут в секундах (можно использовать числа с плавающей точкой); по умолчанию
None, что означает бесконечное ожидание
Изменено в версии 3.5: Функция теперь повторяется с пересчитанным тайм-аутом при прерывании сигналом, за исключением случая, когда обработчик сигнала вызывает исключение (см. PEP 475 для обоснования), вместо вызова
InterruptedError.
Объекты kevent¶Kevent objects
https://man.freebsd.org/cgi/man.cgi?query=kqueue&sektion=2
- kevent.ident¶
Значение, используемое для идентификации события. Интерпретация зависит от фильтра, но обычно это файловый дескриптор. В конструкторе ident может быть либо целым числом, либо объектом с методом
fileno(). kevent хранит целое число внутри.
- kevent.filter¶
Имя фильтра ядра.
Константа
Значение
KQ_FILTER_READПринимает дескриптор и возвращает результат, когда doступны данные для чтения.
KQ_FILTER_WRITEПринимает дескриптор и возвращает результат, когда doступны данные для записи.
KQ_FILTER_AIOЗапросы AIO.
KQ_FILTER_VNODEВозвращает результат, когда происходит одно или несколько запрошенных событий, отслеживаемых в fflag.
KQ_FILTER_PROCОтслеживает события для идентификатора процесса.
KQ_FILTER_NETDEVОтслеживает события на сетевом устройстве (недоступно в macOS).
KQ_FILTER_SIGNALВозвращает результат, когда отслеживаемый сигнал doставляется процессу.
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¶
Пользовательское значение.