select — Ожидание завершения ввода/вывода


Этот модуль предоставляет доступ к функциям select() и poll(), доступным в большинстве операционных систем, devpoll() - в Solaris и производных, epoll() - в Linux 2.5+ и kqueue() - в большинстве BSD. Обратите внимание, что в Windows он работает только для сокетов; в других операционных системах он работает и для других типов файлов (в частности, в Unix он работает для pipes). Его нельзя использовать для обычных файлов, чтобы определить, вырос ли файл с момента последнего чтения.

Примечание

Модуль selectors обеспечивает высокоуровневое и эффективное мультиплексирование ввода/вывода, построенное на примитивах модуля select. Пользователям рекомендуется использовать вместо него модуль selectors, если они не хотят точно контролировать используемые примитивы на уровне ОС.

Модуль определяет следующее:

exception select.error

Утративший силу псевдоним OSError.

Изменено в версии 3.3: После PEP 3151 этот класс стал псевдонимом OSError.

select.devpoll()

(Поддерживается только на Solaris и производных.) Возвращает объект опроса /dev/poll; см. раздел /dev/poll Опрос объектов ниже о методах, поддерживаемых объектами devpoll.

Объекты devpoll() связаны с количеством файловых дескрипторов, разрешенных на момент инстанцирования. Если ваша программа уменьшит это значение, devpoll() завершится неудачей. Если ваша программа увеличит это значение, devpoll() может вернуть неполный список активных файловых дескрипторов.

Новый дескриптор файла - non-inheritable.

Добавлено в версии 3.3.

Изменено в версии 3.4: Новый файловый дескриптор теперь не наследуется.

select.epoll(sizehint=- 1, flags=0)

(Поддерживается только в Linux 2.5.44 и новее.) Возвращает объект опроса края, который можно использовать как интерфейс Edge или Level Triggered для событий ввода/вывода.

sizehint информирует epoll об ожидаемом количестве регистрируемых событий. Оно должно быть положительным, или -1, чтобы использовать значение по умолчанию. Используется только на старых системах, где epoll_create1() недоступен; в противном случае он не имеет никакого эффекта (хотя его значение все равно проверяется).

flags является устаревшим и полностью игнорируется. Однако, при передаче, его значение должно быть 0 или select.EPOLL_CLOEXEC, иначе будет выдано OSError.

Методы, поддерживаемые объектами epolling, см. в разделе Опрос триггера края и уровня (epoll) Объекты ниже.

Объекты epoll поддерживают протокол управления контекстом: при использовании в операторе with новый дескриптор файла автоматически закрывается в конце блока.

Новый дескриптор файла - non-inheritable.

Изменено в версии 3.3: Добавлен параметр флаги.

Изменено в версии 3.4: Добавлена поддержка оператора with. Новый дескриптор файла теперь не наследуется.

Не рекомендуется, начиная с версии 3.4: Параметр флаги. По умолчанию сейчас используется select.EPOLL_CLOEXEC. Используйте os.set_inheritable(), чтобы сделать дескриптор файла наследуемым.

select.poll()

(Поддерживается не всеми операционными системами.) Возвращает объект опроса, который поддерживает регистрацию и снятие с регистрации файловых дескрипторов, а затем опрос их на предмет событий ввода/вывода; о методах, поддерживаемых объектами опроса, см. раздел Объекты опроса ниже.

select.kqueue()

(Поддерживается только на BSD.) Возвращает объект очереди ядра; методы, поддерживаемые объектами kqueue, см. в разделе Объекты Kqueue ниже.

Новый дескриптор файла - non-inheritable.

Изменено в версии 3.4: Новый файловый дескриптор теперь не наследуется.

select.kevent(ident, filter=KQ_FILTER_READ, flags=KQ_EV_ADD, fflags=0, data=0, udata=0)

(Поддерживается только на BSD.) Возвращает объект события ядра; методы, поддерживаемые объектами kevent, см. в разделе Объекты Кевента ниже.

select.select(rlist, wlist, xlist[, timeout])

Это прямой интерфейс к системному вызову Unix select(). Первые три аргумента являются итерациями «ожидающих объектов»: либо целые числа, представляющие дескрипторы файлов, либо объекты с беспараметрическим методом fileno(), возвращающим такое целое число:

  • список: дождаться готовности к чтению

  • wlist: дождаться готовности к записи

  • xlist: ожидание «исключительного условия» (см. страницу руководства о том, что ваша система считает таким условием)

Пустые итерации разрешены, но прием трех пустых итераций зависит от платформы. (Известно, что она работает на Unix, но не на Windows.) Необязательный аргумент timeout задает тайм-аут в виде числа с плавающей точкой в секундах. Если аргумент timeout опущен, функция блокируется до тех пор, пока не будет готов хотя бы один файловый дескриптор. Значение тайм-аута, равное нулю, определяет опрос и никогда не блокируется.

Возвращаемое значение - тройка списков объектов, которые готовы: подмножества первых трех аргументов. При достижении тайм-аута без готовности файлового дескриптора возвращаются три пустых списка.

Среди допустимых типов объектов в итерациях - Python file objects (например, sys.stdin, или объекты, возвращаемые open() или os.popen()), объекты сокетов, возвращаемые socket.socket(). Вы также можете определить класс wrapper самостоятельно, если у него есть соответствующий метод fileno() (который действительно возвращает дескриптор файла, а не просто случайное целое число).

Примечание

Файловые объекты в Windows недопустимы, но сокеты допустимы. В Windows базовая функция select() предоставляется библиотекой WinSock и не обрабатывает файловые дескрипторы, которые не исходят от WinSock.

Изменено в версии 3.5: Теперь при прерывании сигналом функция повторяется с пересчитанным таймаутом, за исключением случаев, когда обработчик сигнала вызывает исключение (см. PEP 475 для обоснования), вместо того, чтобы вызывать InterruptedError.

select.PIPE_BUF

Минимальное количество байт, которое может быть записано без блокировки в трубу, когда труба была объявлена готовой к записи с помощью select(), poll() или другого интерфейса в этом модуле. Это не относится к другим файлоподобным объектам, таким как сокеты.

Это значение гарантируется POSIX как минимум 512.

Availability: 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

Постоянная

Значение

EPOLLIN

Доступно для чтения

EPOLLOUT

Доступно для записи

EPOLLPRI

Срочные данные для чтения

EPOLLERR

Возникло состояние ошибки на ассоц. fd

EPOLLHUP

Повесьте трубку, если она была на заднем плане.

EPOLLET

Установите поведение триггера по краю, по умолчанию используется поведение триггера по уровню

EPOLLONESHOT

Установите однократное поведение. После извлечения одного события fd внутренне отключается.

EPOLLEXCLUSIVE

Пробуждать только один объект epoll, когда на связанном с ним fd происходит событие. По умолчанию (если этот флаг не установлен) пробуждаются все объекты epoll, опрашивающие fd.

EPOLLRDHUP

Пир потокового сокета закрыл соединение или отключил пишущую половину соединения.

EPOLLRDNORM

Эквивалентно EPOLLIN

EPOLLRDBAND

Приоритетная полоса данных может быть считана.

EPOLLWRNORM

Эквивалентно EPOLLOUT

EPOLLWRBAND

Приоритетные данные могут быть записаны.

EPOLLMSG

Игнорируется.

Добавлено в версии 3.6: EPOLLEXCLUSIVE был добавлен. Он поддерживается только ядром Linux Kernel 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.

Изменено в версии 3.9: Метод больше не игнорирует ошибку EBADF.

epoll.poll(timeout=None, maxevents=- 1)

Ожидание событий. таймаут в секундах (плавающая величина)

Изменено в версии 3.5: Теперь при прерывании сигналом функция повторяется с пересчитанным таймаутом, за исключением случаев, когда обработчик сигнала вызывает исключение (см. PEP 475 для обоснования), вместо того, чтобы вызывать InterruptedError.

Объекты опроса

Системный вызов poll(), поддерживаемый в большинстве Unix-систем, обеспечивает лучшую масштабируемость для сетевых серверов, которые обслуживают много-много клиентов одновременно. poll() лучше масштабируется, потому что системный вызов требует только перечисления интересующих дескрипторов файлов, в то время как select() строит битовую карту, включает биты для интересующих fds, а затем снова линейно сканирует всю битовую карту. 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 с errno ENOENT.

poll.unregister(fd)

Удаление дескриптора файла, отслеживаемого объектом опроса. Как и метод register(), fd может быть целым числом или объектом с методом fileno(), который возвращает целое число.

Изменяет уже зарегистрированный fd. Это имеет тот же эффект, что и KeyError. Попытка модифицировать дескриптор файла, который никогда не был зарегистрирован, вызывает исключение с errno .

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 или целое положительное число

  • таймаут в секундах (возможны плавающие значения); по умолчанию None, чтобы ждать вечно

Изменено в версии 3.5: Теперь при прерывании сигналом функция повторяется с пересчитанным таймаутом, за исключением случаев, когда обработчик сигнала вызывает исключение (см. PEP 475 для обоснования), вместо того, чтобы вызывать InterruptedError.

Объекты Кевента

https://www.freebsd.org/cgi/man.cgi?query=kqueue&sektion=2

kevent.ident

Значение, используемое для идентификации события. Интерпретация зависит от фильтра, но обычно это дескриптор файла. В конструкторе ident может быть либо int, либо объектом с методом 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

Disablesevent

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

Значение, определяемое пользователем.

Вернуться на верх