select — Ожидание завершения I/O¶
Модуль обеспечивает доступ к функциям select() и poll(), доступным
в большинстве операционных систем, devpoll() доступным в Solaris и
производных, epoll() доступным в Linux 2.5 + и kqueue() доступным в
большинстве BSD. Обратите внимание, что в Windows работают только для
сокеты; на других операционных системах также работает для других типов
файлов (в частности, в Unix работает над пайпы). Это не может быть
используемый на обычных файлах, чтобы определить, вырос ли файл, так как это было
в последний раз прочитано.
Примечание
Модуль selectors обеспечивает высокоуровневое и эффективное
мультиплексирование I/O, основанное на примитивах модуля select.
Вместо этого пользователям рекомендуется использовать модуль selectors, если
они не хотят точного контроля над примитивами уровня ОС используемый.
Модуль определяет следующее:
-
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Эквивалентно EPOLLINEPOLLRDBANDПриоритетные данные, которые могут быть прочитаны. EPOLLWRNORMЭквивалентно EPOLLOUTEPOLLWRBANDПриоритетные данные могут быть записаны. 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 объектов или
Nonemax_events должен быть равен 0 или положительным целому тайм-ауту в секундах (возможно плавание); значение по умолчанию равноNone, чтобы ждать вечно
Изменено в версии 3.5: Функция теперь повторена с повторно вычисленным перерывом, когда она прервана сигналом, кроме того, если сигнал обработчик поднимает исключение (см. PEP 475 для объяснения), вместо того, чтобы поднять
InterruptedError.- changelist должен быть итерабельным для kevent объектов или
Объекты 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_AIOAIO запросы KQ_FILTER_VNODEВозвращает, когда происходит одно или несколько запрошенных событий, наблюдаемых в fflag KQ_FILTER_PROCWСледите за событиями по id процесса KQ_FILTER_NETDEVСледить за событиями на сетевом устройстве [не доступно на Mac OS X] KQ_FILTER_SIGNALВозвращает всякий раз, когда наблюдаемый сигнал доставляется процессу KQ_FILTER_TIMERУстанавливает произвольный таймер
-
kevent.flags¶ Действие фильтра.
Константа Значение KQ_EV_ADDДобавление или изменение события KQ_EV_DELETEУдаляет событие из очереди KQ_EV_ENABLEPermitscontrol() для возвращаемого события 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_DELETEunlink() был вызван 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¶ Определяемые пользователем значение.
