select — Ожидание завершения I/O


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

Примечание

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

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

exception select.error

Устаревший алиас OSError.

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

select.devpoll()

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

select.poll()

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

select.kqueue()

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

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

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

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

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

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

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

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

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

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

Среди допустимых типов объектов в итерациях - Python файловые объекты (например, 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 объекты Polling

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() будет проверяться наличие в файле дескриптор каких-либо ожидающих событий I/O. fd может быть целым числом или объектом с методом fileno(), который возвращает целое число. Объекты файла осуществляют fileno(), таким образом, они могут также быть используемый как аргументом.

eventmask - это необязательная битовая маска, описывающая тип событий, которые требуется проверить. Константы совпадают с константами для объекта poll(). Дефолт значение является комбинацией констант POLLIN, POLLPRI и POLLOUT.

Предупреждение

Регистрация файла дескриптор, это уже зарегистрировано, не является ошибкой, но результат не определен. Необходимо сначала отменить регистрацию или изменить его. Это важное отличие по сравнению с poll().

devpoll.modify(fd[, eventmask])

Этот метод выполняет unregister(), за которым следует register(). Это (немного) более эффективно, что делать то же самое явно.

devpoll.unregister(fd)

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

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

devpoll.poll([timeout])

Получает голоса набора зарегистрированного файла дескрипторы и возвращает возможно пустой список, содержащий 2 кортежа (fd, event) для дескрипторы, у которых есть события или ошибки сообщить. 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 Повесить трубку на ассоциированном. fd
EPOLLET Установить поведение Edge Trigger, по умолчанию это поведение Level Trigger
EPOLLONESHOT Задать поведение с одним выстрелом. После извлечения одного события fd автоматически отключается
EPOLLEXCLUSIVE Пробуждение только одного объекта epoll, если у связанного fd есть событие. По умолчанию (если этот флаг не установлен) пробуждаются все объекты epoll, выполняющие опрос fd.
EPOLLRDHUP Потоковый сокет однорангового соединения закрывается или завершение записи на половине соединения.
EPOLLRDNORM Эквивалентно EPOLLIN
EPOLLRDBAND Приоритетные данные, которые могут быть прочитаны.
EPOLLWRNORM Эквивалентно EPOLLOUT
EPOLLWRBAND Приоритетные данные могут быть записаны.
EPOLLMSG Игнорируется.

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

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

Дождитесь событий. тайм-аут в секундах (float)

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

Объекты Kqueue

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

poll.register(fd[, eventmask])

Зарегистрировать файл дескриптор в голосующем объекте. Будущие требования к методу poll() тогда проверят, есть ли у файла дескриптор какое-либо ожидание события I/O. fd может быть или целым числом или объектом с методом fileno() это возвращает целое число. Объекты файла осуществляют fileno(), таким образом, они могут также быть используемый как аргументом.

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

Константа Значение
POLLIN Есть данные для чтения
POLLPRI Есть срочные данные для чтения
POLLOUT Готов к выводу: запись не блокируется
POLLERR Состояние какой-то ошибки
POLLHUP Повесить трубку
POLLRDHUP Потоковый сокет однорангового соединения закрывается или завершение записи на половине соединения.
POLLNVAL Недопустимый запрос: дескриптор не открыт

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

poll.modify(fd, eventmask)

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

poll.unregister(fd)

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

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

poll.poll([timeout])

Получает голоса набора зарегистрированного файла дескрипторы и возвращает возможно пустой список, содержащий 2 кортежа (fd, event) для дескрипторы, у которых есть события или ошибки сообщить. 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

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

  • changelist должен быть итерабельным для kevent объектов или None max_events должен быть равен 0 или положительным целому тайм-ауту в секундах (возможно плавание); значение по умолчанию равно None, чтобы ждать вечно

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

Объекты Kevent

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

kevent.ident

Значение используемый для идентификации события. Интерпретация зависит от фильтра, но обычно это файл дескриптор. В идентификаторе конструктора может быть либо int, либо объект с методом fileno(). кевент сохраняет целое число внутри.

kevent.filter

Имя фильтра ядра.

Константа Значение
KQ_FILTER_READ Принимает дескриптор и возвращает при наличии доступных для чтения данных
KQ_FILTER_WRITE Принимает дескриптор и возвращает при наличии доступных для записи данных
KQ_FILTER_AIO AIO запросы
KQ_FILTER_VNODE Возвращает, когда происходит одно или несколько запрошенных событий, наблюдаемых в fflag
KQ_FILTER_PROC WСледите за событиями по id процесса
KQ_FILTER_NETDEV Следить за событиями на сетевом устройстве [не доступно на Mac OS X]
KQ_FILTER_SIGNAL Возвращает всякий раз, когда наблюдаемый сигнал доставляется процессу
KQ_FILTER_TIMER Устанавливает произвольный таймер
kevent.flags

Действие фильтра.

Константа Значение
KQ_EV_ADD Добавление или изменение события
KQ_EV_DELETE Удаляет событие из очереди
KQ_EV_ENABLE Permitscontrol() для возвращаемого события
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

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