Документация Python неофициальный перевод
Содержание страницы

16.1. select – ожидание завершения ввода-выводаselect – Waiting for I/O completion

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

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

exception select.error

Исключение, возбуждаемое при возникновении ошибки. Сопутствующее значение представляет собой пару, содержащую числовой код ошибки из errno и соответствующую строку, как она выводится функцией C perror().

select.epoll([sizehint=-1])

(Поддерживается только на Linux 2.5.44 и новее.) Возвращает объект edge-опроса, который можно использовать как интерфейс с триггерами по фронту или по уровню для событий ввода/вывода; см. раздел Объекты опроса с триггерами по фронту и уровню (epoll) ниже, где перечислены методы, поддерживаемые объектами epoll.

Новое в версии 2.6.

select.poll()

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

select.kqueue()

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

Новое в версии 2.6.

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

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

Новое в версии 2.6.

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

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

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

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

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

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

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

Среди допустимых типов объектов в последовательностях – файловые объекты 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.

16.1.1. Объекты epoll (опроса с фронтальным и уровнем сигналом)Edge and Level Trigger Polling (epoll) Objects

http://linux.die.net/man/4/epoll

eventmask

Константа

Значение

EPOLLIN

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

EPOLLOUT

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

EPOLLPRI

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

EPOLLERR

Возникла ошибка на ассоциированном файловом дескрипторе

EPOLLHUP

Произошёл разрыв соединения на ассоциированном файловом дескрипторе

EPOLLET

Установить триггер по фронту (Edge Trigger), по умолчанию – триггер по уровню (Level Trigger)

EPOLLONESHOT

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

EPOLLRDNORM

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

EPOLLRDBAND

Полоса приоритетных данных доступна для чтения.

EPOLLWRNORM

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

EPOLLWRBAND

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

EPOLLMSG

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

epoll.close()

Закрывает управляющий файловый дескриптор объекта epoll.

epoll.fileno()

Возвращает номер файлового дескриптора управляющего fd.

epoll.fromfd(fd)

Создает объект epoll из заданного файлового дескриптора.

epoll.register(fd[, eventmask])

Регистрирует файловый дескриптор в объекте epoll.

Примечание

Регистрация уже зарегистрированного файлового дескриптора вызывает исключение IOError – в отличие от метода register у Объектов опроса.

epoll.modify(fd, eventmask)

Изменяет зарегистрированный файловый дескриптор.

epoll.unregister(fd)

Удаляет зарегистрированный файловый дескриптор из объекта epoll.

epoll.poll([timeout=-1[, maxevents=-1]])

Ожидает события. timeout в секундах (float)

16.1.2. Объекты опросаPolling Objects

Системный вызов poll(), поддерживаемый в большинстве Unix-систем, обеспечивает лучшую масштабируемость для сетевых серверов, обслуживающих множество клиентов одновременно. poll() масштабируется лучше, поскольку системный вызов требует только перечисления интересующих файловых дескрипторов, тогда как select() строит битовую маску, устанавливает биты для нужных файловых дескрипторов, а затем всю битовую маску приходится снова линейно сканировать. select() имеет сложность O(наибольший файловый дескриптор), а poll() – O(количество файловых дескрипторов).

poll.register(fd[, eventmask])

Регистрирует файловый дескриптор в объекте опроса. Последующие вызовы метода poll() будут проверять, есть ли у файлового дескриптора ожидающие события ввода-вывода. fd может быть целым числом или объектом с методом fileno(), возвращающим целое число. Файловые объекты реализуют fileno(), поэтому их тоже можно использовать в качестве аргумента.

eventmask – необязательная битовая маска, описывающая типы событий для проверки. Может быть комбинацией констант POLLIN, POLLPRI и POLLOUT, описанных в таблице ниже. Если не указана, по умолчанию проверяются все три типа событий.

Константа

Значение

POLLIN

Есть данные для чтения

POLLPRI

Есть срочные данные для чтения

POLLOUT

Готов к выводу: запись не будет блокироваться

POLLERR

Условие ошибки (какого-либо рода)

POLLHUP

Разъединение

POLLNVAL

Некорректный запрос: дескриптор не открыт

Регистрация уже зарегистрированного файлового дескриптора не является ошибкой и имеет тот же эффект, как если бы дескриптор был зарегистрирован ровно один раз.

poll.modify(fd, eventmask)

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

Новое в версии 2.6.

poll.unregister(fd)

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

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

poll.poll([timeout])

Опрашивает набор зарегистрированных файловых дескрипторов и возвращает, возможно, пустой список, содержащий кортежи (fd, event) из двух элементов для дескрипторов, по которым есть события или ошибки. fd – это файловый дескриптор, а event – битовая маска, в которой установлены биты для сообщённых событий этого дескриптора: POLLIN для ожидания ввода, POLLOUT указывает, что дескриптор можно записывать, и так далее. Пустой список означает, что вызов завершился по таймауту и ни один файловый дескриптор не сообщил о событиях. Если задан timeout, он задаёт время в миллисекундах, в течение которого система будет ждать события перед возвратом. Если timeout опущен, отрицателен или равен None, вызов будет блокироваться до появления события для этого объекта poll.

16.1.3. Объекты KqueueKqueue Objects

kqueue.close()

Закрывает файловый дескриптор управления объекта kqueue.

kqueue.fileno()

Возвращает номер файлового дескриптора управляющего fd.

kqueue.fromfd(fd)

Создаёт объект kqueue из заданного файлового дескриптора.

kqueue.control(changelist, max_events[, timeout]) → eventlist

Низкоуровневый интерфейс к kevent

  • changelist должен быть итерируемым объектом, содержащим объекты kevent, или None

  • max_events должен быть 0 или положительным целым числом

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

16.1.4. Объекты KeventKevent Objects

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

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