select.md
1> **Источник:** https://python-all.ru/3.2/library/select.html2>3> «Документация Python на русском» – неофициальный перевод официальной документации Python: версии от 2.6 до 3.16, полнотекстовый поиск, английский оригинал рядом с переводом. Эта Markdown-версия страницы предназначена для работы с LLM: вставьте её в ChatGPT, Claude или Cursor.45---67# 16.1. [`select`](https://python-all.ru/3.2/library/select.html#module-select) – Ожидание завершения ввода/вывода89Этот модуль предоставляет доступ к функциям `select()` и `poll()`, доступным в большинстве операционных систем. `epoll()` доступна на Linux 2.5+ и `kqueue()` – на большинстве BSD. Обратите внимание: в Windows он работает только с сокетами; в других ОС он также работает с другими типами файлов (в частности, в Unix – с каналами). Его нельзя использовать с обычными файлами, чтобы определить, увеличился ли файл с момента последнего чтения.1011Модуль определяет следующее:1213#### `exception select.error`1415Исключение, возникающее при ошибке. Сопутствующее значение – это пара, содержащая числовой код ошибки из `errno` и соответствующую строку, как она была бы выведена функцией C `perror()`.1617#### `select.epoll(sizehint=-1)`1819(Поддерживается только на Linux 2.5.44 и новее.) Возвращает объект edge-опроса, который можно использовать как интерфейс с триггерами по фронту или по уровню для событий ввода/вывода; см. раздел [*Объекты опроса с триггерами по фронту и уровню (epoll)*](https://python-all.ru/3.2/library/select.html#epoll-objects) ниже, где перечислены методы, поддерживаемые объектами epoll.2021#### `select.poll()`2223Поддерживается не всеми операционными системами. Возвращает объект опроса, который поддерживает регистрацию и отмену регистрации файловых дескрипторов, а затем опрос их на предмет событий ввода-вывода; см. раздел [*Polling Objects*](https://python-all.ru/3.2/library/select.html#poll-objects) ниже для методов, поддерживаемых объектами опроса.2425#### `select.kqueue()`2627Поддерживается только на BSD. Возвращает объект очереди ядра; см. раздел [*Kqueue Objects*](https://python-all.ru/3.2/library/select.html#kqueue-objects) ниже для методов, поддерживаемых объектами kqueue.2829#### `select.kevent(ident, filter=KQ_FILTER_READ, flags=KQ_EV_ADD, fflags=0, data=0, udata=0)`3031Поддерживается только на BSD. Возвращает объект события ядра; см. раздел [*Kevent Objects*](https://python-all.ru/3.2/library/select.html#kevent-objects) ниже для методов, поддерживаемых объектами kevent.3233#### `select.select(rlist, wlist, xlist[, timeout])`3435Это прямой интерфейс к системному вызову Unix `select()`. Первые три аргумента – последовательности «ожидающих объектов»: либо целые числа, представляющие файловые дескрипторы, либо объекты с методом без параметров с именем `fileno()`, возвращающим такое целое число:3637- *rlist*: ожидать готовности к чтению38- *wlist*: ожидать готовности к записи39- *xlist*: ожидать «исключительного условия» (см. справочную страницу для того, что ваша система считает таким условием)4041Пустые последовательности допускаются, но поддержка трёх пустых последовательностей зависит от платформы. (Известно, что это работает в Unix, но не в Windows.) Необязательный аргумент *timeout* задаёт тайм-аут в секундах как число с плавающей запятой. Если аргумент *timeout* опущен, функция блокируется, пока хотя бы один файловый дескриптор не будет готов. Нулевой тайм-аут соответствует опросу, без блокировки.4243Возвращаемое значение – тройка списков готовых объектов: подмножества первых трех аргументов. Когда тайм-аут истекает без готовности файлового дескриптора, возвращаются три пустых списка.4445Среди допустимых типов объектов в последовательностях – [*файловые объекты Python*](https://python-all.ru/3.2/glossary.html#term-file-object) (например, `sys.stdin` или объекты, возвращаемые [`open()`](https://python-all.ru/3.2/library/functions.html#open) или `os.popen()`), сокетные объекты, возвращаемые [`socket.socket()`](https://python-all.ru/3.2/library/socket.html#socket.socket). Вы также можете определить собственный класс-*обёртку*, если у него есть подходящий метод `fileno()` (который действительно возвращает файловый дескриптор, а не просто случайное целое число).4647> **Примечание**48>49> Файловые объекты в Windows недопустимы, а сокеты – допустимы. В Windows базовая функция `select()` предоставляется библиотекой WinSock и не обрабатывает файловые дескрипторы, не относящиеся к WinSock.5051#### `select.PIPE_BUF`5253Минимальное количество байт, которое можно записать в канал без блокировки, когда канал был отмечен как готовый к записи с помощью [`select()`](https://python-all.ru/3.2/library/select.html#module-select), [`poll()`](https://python-all.ru/3.2/library/select.html#select.poll) или другого интерфейса в этом модуле. Это не относится к другим видам файлоподобных объектов, таким как сокеты.5455Это значение гарантируется POSIX как минимум 512. Доступность: Unix.5657Новое в версии 3.2.5859## 16.1.1. Объекты опроса с триггерами по фронту и уровню (epoll)6061> [http://linux.die.net/man/4/epoll](https://python-all.ru/3.2/library/select.html)62>63> *eventmask*64>65> | Константа | Значение |66> | --- | --- |67> | `EPOLLIN` | Доступен для чтения |68> | `EPOLLOUT` | Доступен для записи |69> | `EPOLLPRI` | Срочные данные для чтения |70> | `EPOLLERR` | Возникла ошибка на ассоциированном файловом дескрипторе |71> | `EPOLLHUP` | Произошёл разрыв соединения на ассоциированном файловом дескрипторе |72> | `EPOLLET` | Установить триггер по фронту (Edge Trigger), по умолчанию – триггер по уровню (Level Trigger) |73> | `EPOLLONESHOT` | Установить одноразовое поведение. После извлечения одного события файловый дескриптор внутренне отключается. |74> | `EPOLLRDNORM` | Эквивалентен `EPOLLIN` |75> | `EPOLLRDBAND` | Полоса приоритетных данных доступна для чтения. |76> | `EPOLLWRNORM` | Эквивалентен `EPOLLOUT` |77> | `EPOLLWRBAND` | Приоритетные данные могут быть записаны. |78> | `EPOLLMSG` | Игнорируется. |7980#### `epoll.close()`8182Закрывает управляющий файловый дескриптор объекта epoll.8384#### `epoll.fileno()`8586Возвращает номер файлового дескриптора управляющего fd.8788#### `epoll.fromfd(fd)`8990Создает объект epoll из заданного файлового дескриптора.9192#### `epoll.register(fd[, eventmask])`9394Регистрирует файловый дескриптор в объекте epoll.9596> **Примечание**97>98> Регистрация файлового дескриптора, который уже зарегистрирован, вызывает IOError – в отличие от метода register [*объектов опроса*](https://python-all.ru/3.2/library/select.html#poll-objects).99100#### `epoll.modify(fd, eventmask)`101102Изменяет зарегистрированный файловый дескриптор.103104#### `epoll.unregister(fd)`105106Удаляет зарегистрированный файловый дескриптор из объекта epoll.107108#### `epoll.poll(timeout=-1, maxevents=-1)`109110Ожидает события. timeout в секундах (float)111112## 16.1.2. Объекты опроса113114Системный вызов `poll()`, поддерживаемый в большинстве Unix-систем, обеспечивает лучшую масштабируемость для сетевых серверов, обслуживающих множество клиентов одновременно. `poll()` масштабируется лучше, потому что системный вызов требует лишь перечисления интересующих файловых дескрипторов, тогда как `select()` строит битовую карту, устанавливает биты для нужных fd, а затем всю карту приходится снова линейно сканировать. `select()` имеет сложность O(наибольший файловый дескриптор), а `poll()` – O(количество файловых дескрипторов).115116#### `poll.register(fd[, eventmask])`117118Регистрирует файловый дескриптор в объекте опроса. Последующие вызовы метода [`poll()`](https://python-all.ru/3.2/library/select.html#select.poll) будут проверять, есть ли у файлового дескриптора ожидающие события ввода-вывода. *fd* может быть целым числом или объектом с методом `fileno()`, который возвращает целое число. Файловые объекты реализуют `fileno()`, поэтому их также можно использовать в качестве аргумента.119120*eventmask* – необязательная битовая маска, описывающая типы событий, которые требуется отслеживать. Она может быть комбинацией констант `POLLIN`, `POLLPRI` и `POLLOUT`, описанных в таблице ниже. Если она не указана, используется значение по умолчанию, которое отслеживает все три типа событий.121122| Константа | Значение |123| --- | --- |124| `POLLIN` | Есть данные для чтения |125| `POLLPRI` | Есть срочные данные для чтения |126| `POLLOUT` | Готов к выводу: запись не будет блокироваться |127| `POLLERR` | Условие ошибки (какого-либо рода) |128| `POLLHUP` | Разъединение |129| `POLLNVAL` | Некорректный запрос: дескриптор не открыт |130131Регистрация уже зарегистрированного файлового дескриптора не является ошибкой и имеет тот же эффект, как если бы дескриптор был зарегистрирован ровно один раз.132133#### `poll.modify(fd, eventmask)`134135Изменяет уже зарегистрированный fd. Эффект аналогичен `register(fd, eventmask)`. Попытка изменить файловый дескриптор, который никогда не был зарегистрирован, вызывает исключение [`IOError`](https://python-all.ru/3.2/library/exceptions.html#IOError) с errno `ENOENT`.136137#### `poll.unregister(fd)`138139Удаляет файловый дескриптор, отслеживаемый объектом опроса. Как и метод [`register()`](https://python-all.ru/3.2/library/select.html#select.poll.register), *fd* может быть целым числом или объектом с методом `fileno()`, который возвращает целое число.140141Попытка удалить файловый дескриптор, который не был зарегистрирован, вызывает исключение [`KeyError`](https://python-all.ru/3.2/library/exceptions.html#KeyError).142143#### `poll.poll([timeout])`144145Опрашивает набор зарегистрированных файловых дескрипторов и возвращает возможно пустой список, содержащий кортежи из двух элементов `(fd, event)` для дескрипторов, по которым есть события или ошибки. *fd* – файловый дескриптор, а *event* – битовая маска с установленными битами для сообщаемых событий этого дескриптора: `POLLIN` для ожидания ввода, `POLLOUT` – для указания, что в дескриптор можно писать, и так далее. Пустой список означает, что вызов завершился по тайм-ауту и ни один файловый дескриптор не имел событий. Если указан *timeout*, он задаёт время в миллисекундах, которое система будет ждать событий перед возвратом. Если *timeout* опущен, отрицателен или равен [`None`](https://python-all.ru/3.2/library/constants.html#None), вызов будет блокироваться до появления события для этого объекта опроса.146147## 16.1.3. Объекты Kqueue148149#### `kqueue.close()`150151Закрывает файловый дескриптор управления объекта kqueue.152153#### `kqueue.fileno()`154155Возвращает номер файлового дескриптора управляющего fd.156157#### `kqueue.fromfd(fd)`158159Создаёт объект kqueue из заданного файлового дескриптора.160161#### `kqueue.control(changelist, max_events[, timeout=None]) → eventlist`162163Низкоуровневый интерфейс к kevent164165- changelist должен быть итерируемым объектом из kevent или None.166- max\_events должен быть 0 или положительным целым числом167- тайм-аут в секундах (возможны числа с плавающей запятой)168169## 16.1.4. Объекты Kevent170171[http://www.freebsd.org/cgi/man.cgi?query=kqueue&sektion=2](https://python-all.ru/3.2/library/select.html)172173#### `kevent.ident`174175Значение, используемое для идентификации события. Интерпретация зависит от фильтра, но обычно это файловый дескриптор. В конструкторе ident может быть целым числом или объектом с функцией fileno(). kevent хранит целое число внутренне.176177#### `kevent.filter`178179Имя фильтра ядра.180181| Константа | Значение |182| --- | --- |183| `KQ_FILTER_READ` | Принимает дескриптор и возвращает управление при появлении данных, доступных для чтения |184| `KQ_FILTER_WRITE` | Принимает дескриптор и возвращает управление при появлении возможности записи |185| `KQ_FILTER_AIO` | Запросы AIO |186| `KQ_FILTER_VNODE` | Возвращает управление при наступлении одного или нескольких запрошенных событий, за которыми ведется наблюдение в *fflag* |187| `KQ_FILTER_PROC` | Отслеживание событий по идентификатору процесса |188| `KQ_FILTER_NETDEV` | Отслеживание событий на сетевом устройстве \[недоступно в Mac OS X\] |189| `KQ_FILTER_SIGNAL` | Возвращает управление при доставке отслеживаемого сигнала процессу |190| `KQ_FILTER_TIMER` | Устанавливает произвольный таймер |191192#### `kevent.flags`193194Действие фильтра.195196| Константа | Значение |197| --- | --- |198| `KQ_EV_ADD` | Добавляет или изменяет событие |199| `KQ_EV_DELETE` | Удаляет событие из очереди |200| `KQ_EV_ENABLE` | Позволяет control() вернуть событие |201| `KQ_EV_DISABLE` | Отключает событие |202| `KQ_EV_ONESHOT` | Удаляет событие после первого срабатывания |203| `KQ_EV_CLEAR` | Сбрасывает состояние после извлечения события |204| `KQ_EV_SYSFLAGS` | внутреннее событие |205| `KQ_EV_FLAG1` | внутреннее событие |206| `KQ_EV_EOF` | Условие EOF для конкретного фильтра |207| `KQ_EV_ERROR` | См. возвращаемые значения |208209#### `kevent.fflags`210211Флаги, специфичные для фильтра212213`KQ_FILTER_READ` и `KQ_FILTER_WRITE` флаги фильтра:214215| Константа | Значение |216| --- | --- |217| `KQ_NOTE_LOWAT` | нижняя граница буфера сокета |218219`KQ_FILTER_VNODE` флаги фильтра:220221| Константа | Значение |222| --- | --- |223| `KQ_NOTE_DELETE` | была вызвана *unlink()* |224| `KQ_NOTE_WRITE` | произошла запись |225| `KQ_NOTE_EXTEND` | файл был расширен |226| `KQ_NOTE_ATTRIB` | атрибут был изменён |227| `KQ_NOTE_LINK` | количество ссылок изменилось |228| `KQ_NOTE_RENAME` | файл был переименован |229| `KQ_NOTE_REVOKE` | доступ к файлу был отозван |230231`KQ_FILTER_PROC` флаги фильтра:232233| Константа | Значение |234| --- | --- |235| `KQ_NOTE_EXIT` | процесс завершился |236| `KQ_NOTE_FORK` | процесс вызвал *fork()* |237| `KQ_NOTE_EXEC` | процесс запустил новый процесс |238| `KQ_NOTE_PCTRLMASK` | внутренний флаг фильтра |239| `KQ_NOTE_PDATAMASK` | внутренний флаг фильтра |240| `KQ_NOTE_TRACK` | отслеживать процесс через *fork()* |241| `KQ_NOTE_CHILD` | возвращено в дочернем процессе для *NOTE\_TRACK* |242| `KQ_NOTE_TRACKERR` | не удаётся подключиться к дочернему процессу |243244`KQ_FILTER_NETDEV` флаги фильтра (недоступны на Mac OS X):245246| Константа | Значение |247| --- | --- |248| `KQ_NOTE_LINKUP` | соединение активно |249| `KQ_NOTE_LINKDOWN` | соединение разорвано |250| `KQ_NOTE_LINKINV` | состояние соединения недействительно |251252#### `kevent.data`253254Данные, специфичные для фильтра.255256#### `kevent.udata`257258Значение, определённое пользователем.259