Сообщить об ошибке.

Функция poll() модуля select в Python

Опрос файловых дескрипторов на события ввода-вывода

Синтаксис:

import select

# Поддерживается не всеми операционными системами.
poll = select.poll()

Параметры:

  • нет.

Возвращаемое значение:

  • объекта опроса Poll.

Описание:

Функция poll() модуля select возвращает объект опроса Poll, который поддерживает регистрацию и отмену регистрации файловых дескрипторов, а затем опрос их на предмет событий ввода-вывода.

Вызов операционной системы poll() (смотрите в bash $man poll ), поддерживаемый в большинстве систем Unix, обеспечивает лучшую масштабируемость для сетевых серверов, которые обслуживают множество клиентов одновременно.

Вызов функции модуля select.poll() масштабируется лучше, потому что системный вызов требует только перечисления интересующих файловых дескрипторов, в то время как вызов функции select.select() строит битовую карту, включает биты для интересующих файловых дескрипторов, а затем всю битовую карту снова необходимо линейно сканировать.

Методы объекта опроса Poll


Poll.register(fd[, eventmask]):

Метод Poll.register() регистрирует файловый дескриптор fd с объектом опроса. Будущие вызовы [метода Poll.poll() затем будут проверять, есть ли в дескрипторе файла какие-либо ожидающие события ввода-вывода.

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

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

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

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

Poll.modify(fd, eventmask):

Метод Poll.modify() изменяет уже зарегистрированный fd. Метод имеет тот же эффект, что и Poll.register(fd, eventmask).

Попытка изменить файловый дескриптор, который никогда не был зарегистрирован, приводит к возникновению исключения OSError с errno ENOENT.

Poll.unregister(fd):

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

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

Poll.poll([timeout]):

Метод Poll.poll() опрашивает набор/множество зарегистрированных файловых дескрипторов и возвращает возможно пустой список, содержащий 2-кортежи (fd, event) для дескрипторов, которые имеют события или ошибки.

  • fd - это дескриптор файла,
  • событие - это битовая маска с битами, установленными для сообщаемых событий для этого дескриптора
    • select.POLLIN для ожидания ввода,
    • select.POLLOUT для указания того, что дескриптор может быть записан
    • и так далее.

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

  • Если задан аргумент тайм-аута timeout, то он указывает время в миллисекундах, в течение которого система будет ожидать событий перед возвратом результата.
  • Если тайм-аут опущен, отрицателен или None, то вызов будет заблокирован до тех пор, пока не произойдет событие для этого объекта Poll.