Spec-Zone.ru › Python 2.7

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

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

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

exception select.error

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

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

Константа

Значение

EPOLLIN

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

EPOLLOUT

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

EPOLLPRI

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

EPOLLERR

Произошло условие ошибки в assoc. fd

EPOLLHUP

Произошло отключение в assoc. fd

EPOLLET

Установить поведение Edge Trigger, по умолчанию используется поведение Level Trigger

EPOLLONESHOT

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

EPOLLRDNORM

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

EPOLLRDBAND

Можно прочитать данные полосы приоритета.

EPOLLWRNORM

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

EPOLLWRBAND

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

EPOLLMSG

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

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 с errno ENOENT.

Новое в версии 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, для ожидания бесконечно

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

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API