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


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

Informacja

Модуль selectors забезпечує високорівневе й ефективне мультиплексування вводу/виводу, побудоване на основі примітивів модуля select. Замість цього користувачам рекомендується використовувати модуль selectors, якщо вони не бажають точного контролю над використовуваними примітивами рівня ОС.

Dostępność: not WASI.

Этот модуль не работает или недоступен в WebAssembly. См. Платформы веб-сборки для получения дополнительной информации.

Модуль визначає наступне:

exception select.error

Застарілий псевдонім OSError.

Zmienione w wersji 3.3: Після PEP 3151 цей клас отримав псевдонім OSError.

select.devpoll()

(Підтримується лише в Solaris і похідних.) Повертає об’єкт опитування /dev/poll; дивіться розділ /dev/poll Опитування об’єктів нижче щодо методів, які підтримуються об’єктами devpoll.

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

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

Dodane w wersji 3.3.

Zmienione w wersji 3.4: Новий файловий дескриптор тепер не успадковується.

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

(Підтримується лише в Linux 2.5.44 і новіших версіях.) Повертає об’єкт опитування краю, який можна використовувати як інтерфейс Edge або Level Triggered для подій введення/виведення.

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

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

Перегляньте розділ Опитування (epoll) об’єктів тригера краю та рівня нижче, щоб дізнатися про методи, які підтримуються об’єктами електронного опитування.

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

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

Zmienione w wersji 3.3: Додано параметр flags.

Zmienione w wersji 3.4: Додано підтримку оператора with. Новий файловий дескриптор тепер не успадковується.

Niezalecane od wersji 3.4: Параметр flags. select.EPOLL_CLOEXEC зараз використовується за умовчанням. Використовуйте os.set_inheritable(), щоб зробити дескриптор файлу спадковим.

select.poll()

(Підтримується не всіма операційними системами.) Повертає об’єкт опитування, який підтримує реєстрацію та скасування реєстрації дескрипторів файлів, а потім опитування їх для подій введення/виведення; дивіться розділ Об’єкти опитування нижче щодо методів, які підтримуються об’єктами опитування.

select.kqueue()

(Підтримується лише в BSD.) Повертає об’єкт черги ядра; перегляньте розділ Об’єкти Kqueue нижче, щоб дізнатися про методи, які підтримуються об’єктами kqueue.

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

Zmienione w wersji 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() (який дійсно повертає дескриптор файлу, а не просто випадкове ціле число).

Informacja

Файловые объекты в Windows неприемлемы, а сокеты — допустимы. В Windows базовая функция select() предоставляется библиотекой WinSock и не обрабатывает дескрипторы файлов, не происходящие из WinSock.

Zmienione w wersji 3.5: Функція тепер виконується повторно з переобчисленим тайм-аутом, якщо її перериває сигнал, за винятком випадків, коли обробник сигналу викликає виняток (перегляньте PEP 475 для обґрунтування), замість того, щоб викликати InterruptedError.

select.PIPE_BUF

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

POSIX гарантує, що це значення буде не менше 512.

Dodane w wersji 3.2.

/dev/poll Опитування об’єктів

Solaris и его производные имеют /dev/poll. В то время как select() имеет значение O(самый высокий файловый дескриптор), а poll() имеет значение O(количество файловых дескрипторов), /dev /poll — это O(активные файловые дескрипторы).

Поведение /dev/poll очень близко к стандартному объекту poll().

devpoll.close()

Закрийте файловий дескриптор об’єкта опитування.

Dodane w wersji 3.4.

devpoll.closed

True, якщо об’єкт опитування закрито.

Dodane w wersji 3.4.

devpoll.fileno()

Повертає номер дескриптора файлу об’єкта опитування.

Dodane w wersji 3.4.

devpoll.register(fd[, eventmask])

Зареєструйте дескриптор файлу з об’єктом опитування. Подальші виклики методу poll() перевірятимуть, чи є в дескрипторі файлу будь-які незавершені події введення/виведення. fd може бути або цілим числом, або об’єктом із методом fileno(), який повертає ціле число. Файлові об’єкти реалізують fileno(), тому їх також можна використовувати як аргумент.

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

Ostrzeżenie

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

devpoll.modify(fd[, eventmask])

Цей метод виконує unregister(), а потім register(). Це (трохи) ефективніше, ніж робити те саме явно.

devpoll.unregister(fd)

Видаліть дескриптор файлу, який відстежується об’єктом опитування. Як і метод register(), fd може бути цілим числом або об’єктом із методом fileno(), який повертає ціле число.

Спроба видалити дескриптор файлу, який ніколи не був зареєстрований, безпечно ігнорується.

devpoll.poll([timeout])

Опрашивает набор зарегистрированных файловых дескрипторов и возвращает, возможно, пустой список, содержащий двухкортежи (fd, event) для дескрипторов, у которых есть события или ошибки, о которых необходимо сообщить. fd — это дескриптор файла, а event — это битовая маска с битами, установленными для сообщаемых событий для этого дескриптора — POLLIN для ожидания ввода, POLLOUT для указания того, что дескриптор может быть записанным и так далее. Пустой список означает, что время ожидания вызова истекло и ни у одного файлового дескриптора не было событий, о которых можно было бы сообщить. Если задано значение timeout, оно определяет продолжительность времени в миллисекундах, в течение которого система будет ожидать событий перед возвратом. Если timeout опущен, -1 или None, вызов будет блокироваться до тех пор, пока не произойдет событие для этого объекта опроса.

Zmienione w wersji 3.5: Функція тепер виконується повторно з переобчисленим тайм-аутом, якщо її перериває сигнал, за винятком випадків, коли обробник сигналу викликає виняток (перегляньте PEP 475 для обґрунтування), замість того, щоб викликати InterruptedError.

Опитування (epoll) об’єктів тригера краю та рівня

https://linux.die.net/man/4/epoll

маска події

Stała

Znaczenie

EPOLLIN

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

EPOLLOUT

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

EPOLLPRI

Термінові дані для читання

EPOLLERR

Сталася помилка на доц. fd

EPOLLHUP

Зависання сталося на доц. fd

EPOLLET

Встановіть поведінку Edge Trigger, за замовчуванням це Level Trigger

EPOLLONESHOT

Встановіть одноразову поведінку. Після вилучення однієї події fd внутрішньо вимикається

EPOLLEXCLUSIVE

Розбудити лише один об’єкт epoll, якщо пов’язаний fd має подію. За замовчуванням (якщо цей прапорець не встановлено) всі об’єкти epoll запитуються на fd.

EPOLLRDHUP

Потоковий сокет закрив однорангове з’єднання або завершив запис половини з’єднання.

EPOLLRDNORM

Sama dengan EPOLLIN

EPOLLRDBAND

Смугу пріоритетних даних можна зчитувати.

EPOLLWRNORM

Sama dengan EPOLLOUT

EPOLLWRBAND

Пріоритетні дані можуть бути записані.

EPOLLMSG

Ігнорується.

Dodane w wersji 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.

Zmienione w wersji 3.9: Метод більше не ігнорує помилку EBADF.

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

Чекайте подій. тайм-аут у секундах (float)

Zmienione w wersji 3.5: Функція тепер виконується повторно з переобчисленим тайм-аутом, якщо її перериває сигнал, за винятком випадків, коли обробник сигналу викликає виняток (перегляньте PEP 475 для обґрунтування), замість того, щоб викликати InterruptedError.

Об’єкти опитування

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

poll.register(fd[, eventmask])

Зареєструйте дескриптор файлу з об’єктом опитування. Подальші виклики методу poll() перевірятимуть, чи є в дескрипторі файлу будь-які незавершені події введення/виведення. fd може бути або цілим числом, або об’єктом із методом fileno(), який повертає ціле число. Файлові об’єкти реалізують fileno(), тому їх також можна використовувати як аргумент.

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

Stała

Znaczenie

POLLIN

Є дані для читання

POLLPRI

Є термінові дані для читання

POLLOUT

Готовий до виведення: запис не блокуватиметься

POLLERR

Якась помилка

POLLHUP

Повісив

POLLRDHUP

Закрите однорангове з’єднання потокового сокета або завершіть запис половини з’єднання

POLLNVAL

Недійсний запит: дескриптор не відкрито

Реєстрація дескриптора файлу, який уже зареєстровано, не є помилкою та має той самий ефект, що й одноразова реєстрація дескриптора.

poll.modify(fd, eventmask)

Змінює вже зареєстрований fd. Це має той самий ефект, що й register(fd, eventmask). Спроба змінити дескриптор файлу, який ніколи не був зареєстрований, викликає виняток OSError з errno ENOENT.

poll.unregister(fd)

Видаліть дескриптор файлу, який відстежується об’єктом опитування. Як і метод register(), fd може бути цілим числом або об’єктом із методом fileno(), який повертає ціле число.

Спроба видалити дескриптор файлу, який ніколи не був зареєстрований, викликає виняток KeyError.

poll.poll([timeout])

Опрашивает набор зарегистрированных файловых дескрипторов и возвращает, возможно, пустой список, содержащий двухкортежи (fd, event) для дескрипторов, у которых есть события или ошибки, о которых необходимо сообщить. fd — это дескриптор файла, а event — это битовая маска с битами, установленными для сообщаемых событий для этого дескриптора — POLLIN для ожидания ввода, POLLOUT для указания того, что дескриптор может быть записанным и так далее. Пустой список означает, что время ожидания вызова истекло и ни у одного файлового дескриптора не было событий, о которых можно было бы сообщить. Если задано значение timeout, оно определяет продолжительность времени в миллисекундах, в течение которого система будет ожидать событий перед возвратом. Если timeout опущен, имеет отрицательное значение или None, вызов будет блокироваться до тех пор, пока не произойдет событие для этого объекта опроса.

Zmienione w wersji 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

Низькорівневий інтерфейс для kevent

  • список змін має бути ітерованим об’єктами kevent або None

  • max_events має бути 0 або додатним цілим числом

  • тайм-аут у секундах (можливі флоати); типовим є None, чекати вічно

Zmienione w wersji 3.5: Функція тепер виконується повторно з переобчисленим тайм-аутом, якщо її перериває сигнал, за винятком випадків, коли обробник сигналу викликає виняток (перегляньте PEP 475 для обґрунтування), замість того, щоб викликати InterruptedError.

Об’єкти Kevent

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

kevent.ident

Значення, що використовується для ідентифікації події. Інтерпретація залежить від фільтра, але зазвичай це дескриптор файлу. У конструкторі ident може бути або int, або об’єктом із методом fileno(). kevent зберігає ціле число всередині.

kevent.filter

Назва фільтра ядра.

Stała

Znaczenie

KQ_FILTER_READ

Бере дескриптор і повертає, коли є дані, доступні для читання

KQ_FILTER_WRITE

Бере дескриптор і повертає щоразу, коли є дані для запису

KQ_FILTER_AIO

запити AIO

KQ_FILTER_VNODE

Повертається, коли відбувається одна або кілька запитаних подій, які переглядаються в fflag

KQ_FILTER_PROC

Слідкуйте за подіями в ідентифікаторі процесу

KQ_FILTER_NETDEV

Стежити за подіями на мережевому пристрої [недоступно в macOS]

KQ_FILTER_SIGNAL

Повертається щоразу, коли спостережуваний сигнал надходить до процесу

KQ_FILTER_TIMER

Встановлює довільний таймер

kevent.flags

Дія фільтра.

Stała

Znaczenie

KQ_EV_ADD

Додає або змінює подію

KQ_EV_DELETE

Вилучає подію з черги

KQ_EV_ENABLE

Permitscontrol() to повертає подію

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 позначки фільтрів:

Stała

Znaczenie

KQ_NOTE_LOWAT

низька позначка буфера сокета

KQ_FILTER_VNODE позначки фільтра:

Stała

Znaczenie

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 позначки фільтра:

Stała

Znaczenie

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 позначки фільтра (недоступні в macOS):

Stała

Znaczenie

KQ_NOTE_LINKUP

посилання працює

KQ_NOTE_LINKDOWN

посилання не працює

KQ_NOTE_LINKINV

стан посилання недійсний

kevent.data

Фільтр конкретних даних.

kevent.udata

Визначене користувачем значення.