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
.