Документация Python неофициальный перевод

select.md

343 строк · 29.5 КБ · обычная страница · сырой текст · скачать

1> **Источник:** https://python-all.ru/3.4/library/select.html2>3> «Документация Python на русском» – неофициальный перевод официальной документации Python: версии от 2.6 до 3.16, полнотекстовый поиск, английский оригинал рядом с переводом. Эта Markdown-версия страницы предназначена для работы с LLM: вставьте её в ChatGPT, Claude или Cursor.45---67# 18.3. [`select`](https://python-all.ru/3.4/library/select.html#module-select) – Ожидание завершения ввода-вывода89Этот модуль предоставляет доступ к функциям `select()` и `poll()`, доступным в большинстве операционных систем, `devpoll()` – доступна на Solaris и производных, `epoll()` – доступна на Linux 2.5+ и `kqueue()` – доступна на большинстве BSD. Обратите внимание, что в Windows он работает только с сокетами; в других операционных системах он также работает с другими типами файлов (в частности, в Unix – с каналами). Его нельзя использовать с обычными файлами для определения, увеличился ли файл с момента последнего чтения.1011> **Примечание**12>13> Модуль [`selectors`](https://python-all.ru/3.4/library/selectors.html#module-selectors) обеспечивает высокоуровневую и эффективную мультиплексацию ввода-вывода, построенную на примитивах модуля [`select`](https://python-all.ru/3.4/library/select.html#module-select). Пользователям рекомендуется использовать модуль [`selectors`](https://python-all.ru/3.4/library/selectors.html#module-selectors), если только им не нужен точный контроль над используемыми примитивами уровня ОС.1415Модуль определяет следующее:1617#### `exception select.error`1819Устаревший псевдоним [`OSError`](https://python-all.ru/3.4/library/exceptions.html#OSError).2021Изменено в версии 3.3: В соответствии с [**PEP 3151**](https://python-all.ru/3.4/library/select.html), этот класс стал псевдонимом [`OSError`](https://python-all.ru/3.4/library/exceptions.html#OSError).2223#### `select.devpoll()`2425(Поддерживается только в Solaris и производных.) Возвращает объект опроса `/dev/poll`; см. раздел [*/dev/poll Объекты опроса*](https://python-all.ru/3.4/library/select.html#devpoll-objects) ниже для методов, поддерживаемых объектами devpoll.2627Объекты `devpoll()` привязаны к количеству файловых дескрипторов, разрешенному на момент создания. Если программа уменьшает это значение, `devpoll()` завершится ошибкой. Если программа увеличивает это значение, `devpoll()` может вернуть неполный список активных файловых дескрипторов.2829Новый файловый дескриптор является [*ненаследуемым*](https://python-all.ru/3.4/library/os.html#fd-inheritance).3031Новое в версии 3.3.3233Изменено в версии 3.4: Новый файловый дескриптор теперь не наследуется.3435#### `select.epoll(sizehint=-1, flags=0)`3637(Поддерживается только на Linux 2.5.44 и новее.) Возвращает объект опроса по границам (edge polling), который можно использовать как интерфейс с активацией по фронту (Edge) или по уровню (Level) для событий ввода-вывода. *sizehint* устарел и полностью игнорируется. *flags* можно установить в `EPOLL_CLOEXEC`, что приводит к автоматическому закрытию дескриптора epoll при вызове [`os.execve()`](https://python-all.ru/3.4/library/os.html#os.execve).3839См. раздел [*Edge and Level Trigger Polling (epoll) Objects*](https://python-all.ru/3.4/library/select.html#epoll-objects) ниже для методов, поддерживаемых объектами epoll.4041Объекты `epoll` поддерживают протокол управления контекстом: при использовании в операторе [`with`](https://python-all.ru/3.4/reference/compound_stmts.html#with) новый файловый дескриптор автоматически закрывается в конце блока.4243Новый файловый дескриптор является [*ненаследуемым*](https://python-all.ru/3.4/library/os.html#fd-inheritance).4445Изменено в версии 3.3: Добавлен параметр *flags*.4647Изменено в версии 3.4: Добавлена поддержка оператора [`with`](https://python-all.ru/3.4/reference/compound_stmts.html#with). Новый файловый дескриптор теперь не наследуется.4849#### `select.poll()`5051Поддерживается не всеми операционными системами. Возвращает объект опроса, который поддерживает регистрацию и отмену регистрации файловых дескрипторов, а затем опрос их на предмет событий ввода-вывода; см. раздел [*Polling Objects*](https://python-all.ru/3.4/library/select.html#poll-objects) ниже для методов, поддерживаемых объектами опроса.5253#### `select.kqueue()`5455Поддерживается только на BSD. Возвращает объект очереди ядра; см. раздел [*Kqueue Objects*](https://python-all.ru/3.4/library/select.html#kqueue-objects) ниже для методов, поддерживаемых объектами kqueue.5657Новый файловый дескриптор является [*ненаследуемым*](https://python-all.ru/3.4/library/os.html#fd-inheritance).5859Изменено в версии 3.4: Новый файловый дескриптор теперь не наследуется.6061#### `select.kevent(ident, filter=KQ_FILTER_READ, flags=KQ_EV_ADD, fflags=0, data=0, udata=0)`6263Поддерживается только на BSD. Возвращает объект события ядра; см. раздел [*Kevent Objects*](https://python-all.ru/3.4/library/select.html#kevent-objects) ниже для методов, поддерживаемых объектами kevent.6465#### `select.select(rlist, wlist, xlist[, timeout])`6667Это прямой интерфейс к системному вызову Unix `select()`. Первые три аргумента – это последовательности «ожидаемых объектов»: либо целые числа, представляющие файловые дескрипторы, либо объекты с методом без параметров с именем [`fileno()`](https://python-all.ru/3.4/library/io.html#io.IOBase.fileno), возвращающим такое целое число:6869- *rlist*: ожидать готовности к чтению70- *wlist*: ожидать готовности к записи71- *xlist*: ожидать «исключительного условия» (см. справочную страницу для того, что ваша система считает таким условием)7273Пустые последовательности допускаются, но поддержка трёх пустых последовательностей зависит от платформы. (Известно, что это работает в Unix, но не в Windows.) Необязательный аргумент *timeout* задаёт тайм-аут в секундах как число с плавающей запятой. Если аргумент *timeout* опущен, функция блокируется, пока хотя бы один файловый дескриптор не будет готов. Нулевой тайм-аут соответствует опросу, без блокировки.7475Возвращаемое значение – тройка списков готовых объектов: подмножества первых трех аргументов. Когда тайм-аут истекает без готовности файлового дескриптора, возвращаются три пустых списка.7677Среди допустимых типов объектов в последовательностях – [*файловые объекты*](https://python-all.ru/3.4/glossary.html#term-file-object) Python (например, `sys.stdin` или объекты, возвращаемые [`open()`](https://python-all.ru/3.4/library/functions.html#open) или [`os.popen()`](https://python-all.ru/3.4/library/os.html#os.popen)), сокетные объекты, возвращаемые [`socket.socket()`](https://python-all.ru/3.4/library/socket.html#socket.socket). Можно также определить собственный класс-*обёртку*, при условии, что он имеет подходящий метод [`fileno()`](https://python-all.ru/3.4/library/io.html#io.IOBase.fileno) (который действительно возвращает файловый дескриптор, а не просто целое число).7879> **Примечание**80>81> Файловые объекты в Windows недопустимы, а сокеты – допустимы. В Windows базовая функция `select()` предоставляется библиотекой WinSock и не обрабатывает файловые дескрипторы, не относящиеся к WinSock.8283#### `select.PIPE_BUF`8485Минимальное количество байт, которое можно записать в канал без блокировки, когда канал был отмечен как готовый к записи с помощью [`select()`](https://python-all.ru/3.4/library/select.html#select.select), [`poll()`](https://python-all.ru/3.4/library/select.html#select.poll) или другого интерфейса в этом модуле. Это не относится к другим видам файлоподобных объектов, таким как сокеты.8687Это значение гарантируется POSIX как минимум 512. Доступность: Unix.8889Новое в версии 3.2.9091## 18.3.1. `/dev/poll` Объекты опроса9293В Solaris и производных есть `/dev/poll`. В то время как `select()` имеет сложность O(самый высокий файловый дескриптор), а `poll()` – O(количество файловых дескрипторов), `/dev/poll` имеет сложность O(активные файловые дескрипторы).9495Поведение `/dev/poll` очень близко к стандартному объекту `poll()`.9697#### `devpoll.close()`9899Закрывает файловый дескриптор объекта опроса.100101Новое в версии 3.4.102103#### `devpoll.closed`104105`True`, если объект опроса закрыт.106107Новое в версии 3.4.108109#### `devpoll.fileno()`110111Возвращает номер файлового дескриптора объекта опроса.112113Новое в версии 3.4.114115#### `devpoll.register(fd[, eventmask])`116117Регистрирует файловый дескриптор в объекте опроса. Последующие вызовы метода [`poll()`](https://python-all.ru/3.4/library/select.html#select.poll) будут проверять, есть ли у файлового дескриптора ожидающие события ввода-вывода. *fd* может быть целым числом или объектом с методом [`fileno()`](https://python-all.ru/3.4/library/io.html#io.IOBase.fileno), возвращающим целое число. Файловые объекты реализуют `fileno()`, поэтому их также можно использовать в качестве аргумента.118119*eventmask* – необязательная битовая маска, описывающая тип событий, которые нужно отслеживать. Константы те же, что и у объекта `poll()`. Значение по умолчанию – комбинация констант `POLLIN`, `POLLPRI` и `POLLOUT`.120121> **Предупреждение**122>123> Регистрация уже зарегистрированного файлового дескриптора не является ошибкой, но результат не определён. Правильным действием будет сначала отменить регистрацию или изменить его. Это важное отличие от `poll()`.124125#### `devpoll.modify(fd[, eventmask])`126127Этот метод сначала вызывает [`unregister()`](https://python-all.ru/3.4/library/select.html#select.devpoll.unregister), а затем [`register()`](https://python-all.ru/3.4/library/select.html#select.devpoll.register). Он (немного) эффективнее, чем делать то же самое явно.128129#### `devpoll.unregister(fd)`130131Удаляет файловый дескриптор, отслеживаемый объектом опроса. Как и в методе [`register()`](https://python-all.ru/3.4/library/select.html#select.devpoll.register), *fd* может быть целым числом или объектом с методом [`fileno()`](https://python-all.ru/3.4/library/io.html#io.IOBase.fileno), возвращающим целое число.132133Попытка удалить файловый дескриптор, который никогда не был зарегистрирован, безопасно игнорируется.134135#### `devpoll.poll([timeout])`136137Опрашивает набор зарегистрированных файловых дескрипторов и возвращает, возможно, пустой список, содержащий кортежи из двух элементов `(fd, event)` для дескрипторов, по которым есть события или ошибки. *fd* – файловый дескриптор, а *event* – битовая маска с установленными битами для сообщённых событий этого дескриптора: `POLLIN` для ожидания ввода, `POLLOUT` – дескриптор доступен для записи и т. д. Пустой список означает, что вызов завершился по тайм-ауту и ни у одного дескриптора не было событий. Если задан *timeout*, он определяет время в миллисекундах, в течение которого система будет ждать события перед возвратом. Если *timeout* опущен, равен -1 или [`None`](https://python-all.ru/3.4/library/constants.html#None), вызов будет блокироваться до появления события для этого объекта опроса.138139## 18.3.2. Edge и Level Trigger Polling (epoll) объекты140141> [http://linux.die.net/man/4/epoll](https://python-all.ru/3.4/library/select.html)142>143> *eventmask*144>145> | Константа | Значение |146> | --- | --- |147> | `EPOLLIN` | Доступен для чтения |148> | `EPOLLOUT` | Доступен для записи |149> | `EPOLLPRI` | Срочные данные для чтения |150> | `EPOLLERR` | Возникла ошибка на ассоциированном файловом дескрипторе |151> | `EPOLLHUP` | Произошёл разрыв соединения на ассоциированном файловом дескрипторе |152> | `EPOLLET` | Установить триггер по фронту (Edge Trigger), по умолчанию – триггер по уровню (Level Trigger) |153> | `EPOLLONESHOT` | Установить одноразовое поведение. После извлечения одного события файловый дескриптор внутренне отключается. |154> | `EPOLLRDNORM` | Эквивалентен `EPOLLIN` |155> | `EPOLLRDBAND` | Полоса приоритетных данных доступна для чтения. |156> | `EPOLLWRNORM` | Эквивалентен `EPOLLOUT` |157> | `EPOLLWRBAND` | Приоритетные данные могут быть записаны. |158> | `EPOLLMSG` | Игнорируется. |159160#### `epoll.close()`161162Закрывает управляющий файловый дескриптор объекта epoll.163164#### `epoll.closed`165166`True`, если объект epoll закрыт.167168#### `epoll.fileno()`169170Возвращает номер файлового дескриптора управляющего fd.171172#### `epoll.fromfd(fd)`173174Создает объект epoll из заданного файлового дескриптора.175176#### `epoll.register(fd[, eventmask])`177178Регистрирует файловый дескриптор в объекте epoll.179180#### `epoll.modify(fd, eventmask)`181182Изменяет зарегистрированный файловый дескриптор.183184#### `epoll.unregister(fd)`185186Удаляет зарегистрированный файловый дескриптор из объекта epoll.187188#### `epoll.poll(timeout=-1, maxevents=-1)`189190Ожидает события. timeout в секундах (float)191192## 18.3.3. Объекты опроса193194Системный вызов `poll()`, поддерживаемый в большинстве Unix-систем, обеспечивает лучшую масштабируемость для сетевых серверов, обслуживающих множество клиентов одновременно. `poll()` масштабируется лучше, потому что системный вызов требует лишь перечисления интересующих файловых дескрипторов, тогда как `select()` строит битовую карту, устанавливает биты для нужных fd, а затем всю карту приходится снова линейно сканировать. `select()` имеет сложность O(наибольший файловый дескриптор), а `poll()` – O(количество файловых дескрипторов).195196#### `poll.register(fd[, eventmask])`197198Регистрирует файловый дескриптор в объекте опроса. При последующих вызовах метода [`poll()`](https://python-all.ru/3.4/library/select.html#select.poll) будет проверяться, есть ли у файлового дескриптора ожидающие события ввода-вывода. *fd* может быть целым числом или объектом с методом [`fileno()`](https://python-all.ru/3.4/library/io.html#io.IOBase.fileno), возвращающим целое число. Файловые объекты реализуют `fileno()`, поэтому их также можно использовать в качестве аргумента.199200*eventmask* – необязательная битовая маска, описывающая типы событий, которые требуется отслеживать. Она может быть комбинацией констант `POLLIN`, `POLLPRI` и `POLLOUT`, описанных в таблице ниже. Если она не указана, используется значение по умолчанию, которое отслеживает все три типа событий.201202| Константа | Значение |203| --- | --- |204| `POLLIN` | Есть данные для чтения |205| `POLLPRI` | Есть срочные данные для чтения |206| `POLLOUT` | Готов к выводу: запись не будет блокироваться |207| `POLLERR` | Условие ошибки (какого-либо рода) |208| `POLLHUP` | Разъединение |209| `POLLNVAL` | Некорректный запрос: дескриптор не открыт |210211Регистрация уже зарегистрированного файлового дескриптора не является ошибкой и имеет тот же эффект, как если бы дескриптор был зарегистрирован ровно один раз.212213#### `poll.modify(fd, eventmask)`214215Изменяет уже зарегистрированный fd. Действует так же, как `register(fd, eventmask)`. Попытка изменить файловый дескриптор, который не был зарегистрирован, вызывает исключение [`OSError`](https://python-all.ru/3.4/library/exceptions.html#OSError) с errno `ENOENT`.216217#### `poll.unregister(fd)`218219Удаляет файловый дескриптор, отслеживаемый объектом опроса. Как и метод [`register()`](https://python-all.ru/3.4/library/select.html#select.poll.register), *fd* может быть целым числом или объектом с методом [`fileno()`](https://python-all.ru/3.4/library/io.html#io.IOBase.fileno), возвращающим целое число.220221Попытка удалить файловый дескриптор, который не был зарегистрирован, вызывает исключение [`KeyError`](https://python-all.ru/3.4/library/exceptions.html#KeyError).222223#### `poll.poll([timeout])`224225Опрашивает набор зарегистрированных файловых дескрипторов и возвращает возможно пустой список, содержащий кортежи из двух элементов `(fd, event)` для дескрипторов, по которым есть события или ошибки. *fd* – файловый дескриптор, а *event* – битовая маска с установленными битами для сообщаемых событий этого дескриптора: `POLLIN` для ожидания ввода, `POLLOUT` – для указания, что в дескриптор можно писать, и так далее. Пустой список означает, что вызов завершился по тайм-ауту и ни один файловый дескриптор не имел событий. Если указан *timeout*, он задаёт время в миллисекундах, которое система будет ждать событий перед возвратом. Если *timeout* опущен, отрицателен или равен [`None`](https://python-all.ru/3.4/library/constants.html#None), вызов будет блокироваться до появления события для этого объекта опроса.226227## 18.3.4. Объекты kqueue228229#### `kqueue.close()`230231Закрывает файловый дескриптор управления объекта kqueue.232233#### `kqueue.closed`234235`True`, если объект kqueue закрыт.236237#### `kqueue.fileno()`238239Возвращает номер файлового дескриптора управляющего fd.240241#### `kqueue.fromfd(fd)`242243Создаёт объект kqueue из заданного файлового дескриптора.244245#### `kqueue.control(changelist, max_events[, timeout=None]) → eventlist`246247Низкоуровневый интерфейс к kevent248249- changelist должен быть итерируемым объектом из kevent или None.250- max\_events должен быть 0 или положительным целым числом251- тайм-аут в секундах (возможны числа с плавающей запятой)252253## 18.3.5. Объекты kevent254255[http://www.freebsd.org/cgi/man.cgi?query=kqueue&sektion=2](https://python-all.ru/3.4/library/select.html)256257#### `kevent.ident`258259Значение, используемое для идентификации события. Интерпретация зависит от фильтра, но обычно это файловый дескриптор. В конструкторе ident может быть целым числом или объектом с методом [`fileno()`](https://python-all.ru/3.4/library/io.html#io.IOBase.fileno). kevent хранит целое число внутри.260261#### `kevent.filter`262263Имя фильтра ядра.264265| Константа | Значение |266| --- | --- |267| `KQ_FILTER_READ` | Принимает дескриптор и возвращает управление при появлении данных, доступных для чтения |268| `KQ_FILTER_WRITE` | Принимает дескриптор и возвращает управление при появлении возможности записи |269| `KQ_FILTER_AIO` | Запросы AIO |270| `KQ_FILTER_VNODE` | Возвращает управление при наступлении одного или нескольких запрошенных событий, за которыми ведется наблюдение в *fflag* |271| `KQ_FILTER_PROC` | Отслеживание событий по идентификатору процесса |272| `KQ_FILTER_NETDEV` | Отслеживание событий на сетевом устройстве \[недоступно в Mac OS X\] |273| `KQ_FILTER_SIGNAL` | Возвращает управление при доставке отслеживаемого сигнала процессу |274| `KQ_FILTER_TIMER` | Устанавливает произвольный таймер |275276#### `kevent.flags`277278Действие фильтра.279280| Константа | Значение |281| --- | --- |282| `KQ_EV_ADD` | Добавляет или изменяет событие |283| `KQ_EV_DELETE` | Удаляет событие из очереди |284| `KQ_EV_ENABLE` | Позволяет control() вернуть событие |285| `KQ_EV_DISABLE` | Отключает событие |286| `KQ_EV_ONESHOT` | Удаляет событие после первого срабатывания |287| `KQ_EV_CLEAR` | Сбрасывает состояние после извлечения события |288| `KQ_EV_SYSFLAGS` | внутреннее событие |289| `KQ_EV_FLAG1` | внутреннее событие |290| `KQ_EV_EOF` | Условие EOF для конкретного фильтра |291| `KQ_EV_ERROR` | См. возвращаемые значения |292293#### `kevent.fflags`294295Флаги, специфичные для фильтра296297`KQ_FILTER_READ` и `KQ_FILTER_WRITE` флаги фильтра:298299| Константа | Значение |300| --- | --- |301| `KQ_NOTE_LOWAT` | нижняя граница буфера сокета |302303`KQ_FILTER_VNODE` флаги фильтра:304305| Константа | Значение |306| --- | --- |307| `KQ_NOTE_DELETE` | была вызвана *unlink()* |308| `KQ_NOTE_WRITE` | произошла запись |309| `KQ_NOTE_EXTEND` | файл был расширен |310| `KQ_NOTE_ATTRIB` | атрибут был изменён |311| `KQ_NOTE_LINK` | количество ссылок изменилось |312| `KQ_NOTE_RENAME` | файл был переименован |313| `KQ_NOTE_REVOKE` | доступ к файлу был отозван |314315`KQ_FILTER_PROC` флаги фильтра:316317| Константа | Значение |318| --- | --- |319| `KQ_NOTE_EXIT` | процесс завершился |320| `KQ_NOTE_FORK` | процесс вызвал *fork()* |321| `KQ_NOTE_EXEC` | процесс запустил новый процесс |322| `KQ_NOTE_PCTRLMASK` | внутренний флаг фильтра |323| `KQ_NOTE_PDATAMASK` | внутренний флаг фильтра |324| `KQ_NOTE_TRACK` | отслеживать процесс через *fork()* |325| `KQ_NOTE_CHILD` | возвращено в дочернем процессе для *NOTE\_TRACK* |326| `KQ_NOTE_TRACKERR` | не удаётся подключиться к дочернему процессу |327328`KQ_FILTER_NETDEV` флаги фильтра (недоступны на Mac OS X):329330| Константа | Значение |331| --- | --- |332| `KQ_NOTE_LINKUP` | соединение активно |333| `KQ_NOTE_LINKDOWN` | соединение разорвано |334| `KQ_NOTE_LINKINV` | состояние соединения недействительно |335336#### `kevent.data`337338Данные, специфичные для фильтра.339340#### `kevent.udata`341342Значение, определённое пользователем.343