select.md
1> **Источник:** https://python-all.ru/3.0/library/select.html2>3> «Документация Python на русском» – неофициальный перевод официальной документации Python: версии от 2.6 до 3.16, полнотекстовый поиск, английский оригинал рядом с переводом. Эта Markdown-версия страницы предназначена для работы с LLM: вставьте её в ChatGPT, Claude или Cursor.45---67# `select` – Ожидание завершения ввода-вывода89Этот модуль предоставляет доступ к функциям `select` и `poll`, доступным в большинстве операционных систем, `epoll` – на Linux 2.5+ и `kqueue` – на большинстве систем BSD. Обратите внимание: в Windows он работает только с сокетами; в других ОС он также работает с другими типами файлов (в частности, в Unix – с каналами). Его нельзя использовать с обычными файлами для определения, увеличился ли файл с момента последнего чтения.1011Модуль определяет следующее:1213#### `[select.error]exception select.error`1415Исключение, которое возбуждается при ошибке. Сопутствующее значение представляет собой пару, содержащую числовой код ошибки из1617`errno`1819и соответствующую строку, как она была бы выведена функцией C2021`perror`2223.2425#### `[select.epoll]select.epoll([sizehint=-1])`2627(Поддерживается только на Linux 2.5.44 и новее.) Возвращает объект edge-опроса, который можно использовать как интерфейс с триггерами по фронту или по уровню для событий ввода/вывода; см. раздел2829[*Объекты опроса с триггерами по фронту и уровню (epoll)*](https://python-all.ru/3.0/library/select.html#epoll-objects)3031ниже, где перечислены методы, поддерживаемые объектами epoll.3233#### `[select.poll]select.poll()`3435Поддерживается не всеми операционными системами. Возвращает объект опроса, который поддерживает регистрацию и отмену регистрации файловых дескрипторов, а затем опрос их на предмет событий ввода-вывода; см. раздел3637[*Polling Objects*](https://python-all.ru/3.0/library/select.html#poll-objects)3839ниже для методов, поддерживаемых объектами опроса.4041#### `[select.kqueue]select.kqueue()`4243(Поддерживается только в BSD.) Возвращает объект очереди ядра; см. раздел4445[*Kqueue Objects*](https://python-all.ru/3.0/library/select.html#kqueue-objects)4647ниже для получения списка методов, поддерживаемых объектами kqueue.4849#### `[select.kevent]select.kevent(ident, filter=KQ_FILTER_READ, flags=KQ_ADD, fflags=0, data=0, udata=0)`5051(Поддерживается только в BSD.) Возвращает объект события ядра; см. раздел5253[*Kevent Objects*](https://python-all.ru/3.0/library/select.html#kevent-objects)5455ниже для получения списка методов, поддерживаемых объектами kqueue.5657#### `[select.select]select.select(rlist, wlist, xlist[, timeout])`5859Это прямой интерфейс к системному вызову `select` Unix. Первые три аргумента – последовательности «ожидающих объектов»: либо целые числа, представляющие файловые дескрипторы, либо объекты с методом без параметров с именем `fileno()`, возвращающим такое целое число:6061- *rlist*: ожидать готовности к чтению62- *wlist*: ожидать готовности к записи63- *xlist*: ожидать «исключительного условия» (см. справочную страницу для того, что ваша система считает таким условием)6465Пустые последовательности допускаются, но поддержка трёх пустых последовательностей зависит от платформы. (Известно, что это работает в Unix, но не в Windows.) Необязательный аргумент *timeout* задаёт тайм-аут в секундах как число с плавающей запятой. Если аргумент *timeout* опущен, функция блокируется, пока хотя бы один файловый дескриптор не будет готов. Нулевой тайм-аут соответствует опросу, без блокировки.6667Возвращаемое значение – тройка списков готовых объектов: подмножества первых трех аргументов. Когда тайм-аут истекает без готовности файлового дескриптора, возвращаются три пустых списка.6869Среди допустимых типов объектов в последовательностях – файловые объекты Python (например, `sys.stdin`, или объекты, возвращаемые [`open()`](https://python-all.ru/3.0/library/functions.html#open) или `os.popen()`), сокетные объекты, возвращаемые [`socket.socket()`](https://python-all.ru/3.0/library/socket.html#socket.socket). Можно также определить собственный *класс-обёртку* при условии, что он имеет подходящий метод `fileno()` (который действительно возвращает файловый дескриптор, а не просто случайное целое число).7071> **Примечание**72>73> Файловые объекты в Windows недопустимы, в отличие от сокетов. В Windows базовая функция `select` предоставляется библиотекой WinSock и не обрабатывает файловые дескрипторы, которые не происходят из WinSock.7475## Объекты опроса с триггером по фронту и уровню (epoll)7677> [http://linux.die.net/man/4/epoll](https://python-all.ru/3.0/library/select.html)78>79> *eventmask*80>81> | Константа | Значение |82> | --- | --- |83> | `EPOLLIN` | Доступен для чтения |84> | `EPOLLOUT` | Доступен для записи |85> | `EPOLLPRI` | Срочные данные для чтения |86> | `EPOLLERR` | Возникла ошибка на ассоциированном файловом дескрипторе |87> | `EPOLLHUP` | Произошёл разрыв соединения на ассоциированном файловом дескрипторе |88> | `EPOLLET` | Установить триггер по фронту (Edge Trigger), по умолчанию – триггер по уровню (Level Trigger) |89> | `EPOLLONESHOT` | Установить одноразовое поведение. После извлечения одного события файловый дескриптор внутренне отключается. |90> | `EPOLLRDNORM` | ??? |91> | `EPOLLRDBAND` | ??? |92> | `EPOLLWRNORM` | ??? |93> | `EPOLLWRBAND` | ??? |94> | `EPOLLMSG` | ??? |9596#### `[select.epoll.close]epoll.close()`9798Закрывает управляющий файловый дескриптор объекта epoll.99100#### `[select.epoll.fileno]epoll.fileno()`101102Возвращает номер файлового дескриптора управляющего fd.103104#### `[select.epoll.fromfd]epoll.fromfd(fd)`105106Создает объект epoll из заданного файлового дескриптора.107108#### `[select.epoll.register]epoll.register(fd[, eventmask])`109110Регистрирует файловый дескриптор в объекте epoll.111112#### `[select.epoll.modify]epoll.modify(fd, eventmask)`113114Изменяет зарегистрированный файловый дескриптор.115116#### `[select.epoll.unregister]epoll.unregister(fd)`117118Удаляет зарегистрированный файловый дескриптор из объекта epoll.119120#### `[select.epoll.poll]epoll.poll([timeout=-1[, maxevents=-1]])`121122Ожидает события. timeout в секундах (float)123124## Объекты опроса125126Системный вызов `poll`, поддерживаемый в большинстве систем Unix, обеспечивает лучшую масштабируемость для сетевых серверов, обслуживающих одновременно очень много клиентов. `poll` масштабируется лучше, поскольку системный вызов требует лишь перечислить интересующие файловые дескрипторы, в то время как `select` строит битовую маску, включает биты для нужных fd, а затем всю маску приходится снова линейно сканировать. `select` имеет сложность O(самый большой файловый дескриптор), а `poll` – O(количество файловых дескрипторов).127128#### `[select.poll.register]poll.register(fd[, eventmask])`129130Регистрирует файловый дескриптор в объекте опроса. Последующие вызовы метода [`poll()`](https://python-all.ru/3.0/library/select.html#select.poll) будут проверять, есть ли у файлового дескриптора ожидающие события ввода-вывода. *fd* может быть целым числом или объектом с методом `fileno()`, который возвращает целое число. Файловые объекты реализуют `fileno()`, поэтому их также можно использовать в качестве аргумента.131132*eventmask* – необязательная битовая маска, описывающая типы событий, которые требуется отслеживать. Она может быть комбинацией констант `POLLIN`, `POLLPRI` и `POLLOUT`, описанных в таблице ниже. Если она не указана, используется значение по умолчанию, которое отслеживает все три типа событий.133134| Константа | Значение |135| --- | --- |136| `POLLIN` | Есть данные для чтения |137| `POLLPRI` | Есть срочные данные для чтения |138| `POLLOUT` | Готов к выводу: запись не будет блокироваться |139| `POLLERR` | Условие ошибки (какого-либо рода) |140| `POLLHUP` | Разъединение |141| `POLLNVAL` | Некорректный запрос: дескриптор не открыт |142143Регистрация уже зарегистрированного файлового дескриптора не является ошибкой и имеет тот же эффект, как если бы дескриптор был зарегистрирован ровно один раз.144145#### `[select.poll.modify]poll.modify(fd, eventmask)`146147Изменяет уже зарегистрированный fd. Действие аналогично вызову148149`register(fd, eventmask)()`150151. Попытка изменить файловый дескриптор, который никогда не был зарегистрирован, вызывает исключение152153[`IOError`](https://python-all.ru/3.0/library/exceptions.html#exceptions.IOError)154155с errno156157`ENOENT`158159.160161#### `[select.poll.unregister]poll.unregister(fd)`162163Удаляет файловый дескриптор, отслеживаемый объектом опроса. Как и метод [`register()`](https://python-all.ru/3.0/library/select.html#select.poll.register), *fd* может быть целым числом или объектом с методом `fileno()`, который возвращает целое число.164165Попытка удалить файловый дескриптор, который не был зарегистрирован, вызывает исключение [`KeyError`](https://python-all.ru/3.0/library/exceptions.html#exceptions.KeyError).166167#### `[select.poll.poll]poll.poll([timeout])`168169Опрашивает набор зарегистрированных файловых дескрипторов и возвращает возможно пустой список, содержащий кортежи из двух элементов170171`(fd, event)`172173для дескрипторов, по которым есть события или ошибки.174175*fd*176177– файловый дескриптор, а178179*event*180181– битовая маска с установленными битами для сообщаемых событий этого дескриптора:182183`POLLIN`184185для ожидания ввода,186187`POLLOUT`188189– для указания, что в дескриптор можно писать, и так далее. Пустой список означает, что вызов завершился по тайм-ауту и ни один файловый дескриптор не имел событий. Если указан190191*timeout*192193, он задаёт время в миллисекундах, которое система будет ждать событий перед возвратом. Если194195*timeout*196197опущен, отрицателен или равен198199[`None`](https://python-all.ru/3.0/library/constants.html#None)200201, вызов будет блокироваться до появления события для этого объекта опроса.202203## Объекты Kqueue204205#### `[select.kqueue.close]kqueue.close()`206207Закрывает файловый дескриптор управления объекта kqueue.208209#### `[select.kqueue.fileno]kqueue.fileno()`210211Возвращает номер файлового дескриптора управляющего fd.212213#### `[select.kqueue.fromfd]kqueue.fromfd(fd)`214215Создаёт объект kqueue из заданного файлового дескриптора.216217#### `[select.kqueue.control]kqueue.control(changelist, max_events[, timeout=None]) → eventlist`218219Низкоуровневый интерфейс к kevent220221- changelist должен быть итерируемым объектом из kevent или None.222- max\_events должен быть 0 или положительным целым числом223- тайм-аут в секундах (возможны числа с плавающей запятой)224225## Объекты Kevent226227[http://www.freebsd.org/cgi/man.cgi?query=kqueue&sektion=2](https://python-all.ru/3.0/library/select.html)228229#### `[select.kevent.ident]kevent.ident`230231Значение, используемое для идентификации события. Интерпретация зависит от фильтра, но обычно это файловый дескриптор. В конструкторе ident может быть целым числом или объектом с функцией fileno(). kevent хранит целое число внутренне.232233#### `[select.kevent.filter]kevent.filter`234235Имя фильтра ядра236237| Константа | Значение |238| --- | --- |239| `KQ_FILTER_READ` | Принимает дескриптор и возвращает управление при появлении данных, доступных для чтения |240| `KQ_FILTER_WRITE` | Принимает дескриптор и возвращает управление при появлении данных, доступных для чтения |241| `KQ_FILTER_AIO` | Запросы AIO |242| `KQ_FILTER_VNODE` | Возвращает управление при наступлении одного или нескольких запрошенных событий, за которыми ведется наблюдение в *fflag* |243| `KQ_FILTER_PROC` | Отслеживание событий по идентификатору процесса |244| `KQ_FILTER_NETDEV` | Отслеживание событий на сетевом устройстве \[недоступно в Mac OS X\] |245| `KQ_FILTER_SIGNAL` | Возвращает управление при доставке отслеживаемого сигнала процессу |246| `KQ_FILTER_TIMER` | Устанавливает произвольный таймер |247248#### `[select.kevent.flags]kevent.flags`249250Действие фильтра251252| Константа | Значение |253| --- | --- |254| `KQ_EV_ADD` | Добавляет или изменяет событие |255| `KQ_EV_DELETE` | Удаляет событие из очереди |256| `KQ_EV_ENABLE` | Позволяет control() вернуть событие |257| `KQ_EV_DISABLE` | Отключает событие |258| `KQ_EV_ONESHOT` | Удаляет событие после первого срабатывания |259| `KQ_EV_CLEAR` | Сбрасывает состояние после извлечения события |260| `KQ_EV_SYSFLAGS` | внутреннее событие |261| `KQ_EV_FLAG1` | внутреннее событие |262| `KQ_EV_EOF` | Условие EOF для конкретного фильтра |263| `KQ_EV_ERROR` | См. возвращаемые значения |264265#### `[select.kevent.fflags]kevent.fflags`266267Флаги конкретного фильтра268269`KQ_FILTER_READ` и `KQ_FILTER_WRITE` – флаги фильтров270271| Константа | Значение |272| --- | --- |273| `KQ_NOTE_LOWAT` | нижняя граница буфера сокета |274275`KQ_FILTER_VNODE` – флаги фильтра276277| Константа | Значение |278| --- | --- |279| `KQ_NOTE_DELETE` | была вызвана *unlink()* |280| `KQ_NOTE_WRITE` | произошла запись |281| `KQ_NOTE_EXTEND` | файл был расширен |282| `KQ_NOTE_ATTRIB` | атрибут был изменён |283| `KQ_NOTE_LINK` | количество ссылок изменилось |284| `KQ_NOTE_RENAME` | файл был переименован |285| `KQ_NOTE_REVOKE` | доступ к файлу был отозван |286287`KQ_FILTER_PROC` – флаги фильтра288289| Константа | Значение |290| --- | --- |291| `KQ_NOTE_EXIT` | процесс завершился |292| `KQ_NOTE_FORK` | процесс вызвал *fork()* |293| `KQ_NOTE_EXEC` | процесс запустил новый процесс |294| `KQ_NOTE_PCTRLMASK` | внутренний флаг фильтра |295| `KQ_NOTE_PDATAMASK` | внутренний флаг фильтра |296| `KQ_NOTE_TRACK` | отслеживать процесс через *fork()* |297| `KQ_NOTE_CHILD` | возвращено в дочернем процессе для *NOTE\_TRACK* |298| `KQ_NOTE_TRACKERR` | не удаётся подключиться к дочернему процессу |299300`KQ_FILTER_NETDEV` флаги фильтра \[недоступно на Mac OS X\]301302| Константа | Значение |303| --- | --- |304| `KQ_NOTE_LINKUP` | соединение активно |305| `KQ_NOTE_LINKDOWN` | соединение разорвано |306| `KQ_NOTE_LINKINV` | состояние соединения недействительно |307308#### `[select.kevent.data]kevent.data`309310Данные, специфичные для фильтра311312#### `[select.kevent.udata]kevent.udata`313314Пользовательское значение315