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

select.md

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

1> **Источник:** https://python-all.ru/2.7/library/select.html2>3> «Документация Python на русском» – неофициальный перевод официальной документации Python: версии от 2.6 до 3.16, полнотекстовый поиск, английский оригинал рядом с переводом. Эта Markdown-версия страницы предназначена для работы с LLM: вставьте её в ChatGPT, Claude или Cursor.45---67# 16.1. [`select`](https://python-all.ru/2.7/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/2.7/library/select.html#epoll-objects) ниже, где перечислены методы, поддерживаемые объектами epoll.2021Новое в версии 2.6.2223#### `select.poll()`2425Поддерживается не всеми операционными системами. Возвращает объект опроса, который поддерживает регистрацию и отмену регистрации файловых дескрипторов, а затем опрос их на предмет событий ввода-вывода; см. раздел [Polling Objects](https://python-all.ru/2.7/library/select.html#poll-objects) ниже для методов, поддерживаемых объектами опроса.2627#### `select.kqueue()`2829Поддерживается только на BSD. Возвращает объект очереди ядра; см. раздел [Kqueue Objects](https://python-all.ru/2.7/library/select.html#kqueue-objects) ниже для методов, поддерживаемых объектами kqueue.3031Новое в версии 2.6.3233#### `select.kevent(ident, filter=KQ_FILTER_READ, flags=KQ_EV_ADD, fflags=0, data=0, udata=0)`3435Поддерживается только на BSD. Возвращает объект события ядра; см. раздел [Kevent Objects](https://python-all.ru/2.7/library/select.html#kevent-objects) ниже для методов, поддерживаемых объектами kevent.3637Новое в версии 2.6.3839#### `select.select(rlist, wlist, xlist[, timeout])`4041Это простой интерфейс к системному вызову `select()` Unix. Первые три аргумента – последовательности «ожидаемых объектов»: целые числа, представляющие файловые дескрипторы, или объекты с методом без параметров [`fileno()`](https://python-all.ru/2.7/library/io.html#io.IOBase.fileno), возвращающим такое целое число:4243- *rlist*: ожидать готовности к чтению44- *wlist*: ожидать готовности к записи45- *xlist*: ожидать «исключительного условия» (см. справочную страницу для того, что ваша система считает таким условием)4647Пустые последовательности допускаются, но поддержка трёх пустых последовательностей зависит от платформы. (Известно, что это работает в Unix, но не в Windows.) Необязательный аргумент *timeout* задаёт тайм-аут в секундах как число с плавающей запятой. Если аргумент *timeout* опущен, функция блокируется, пока хотя бы один файловый дескриптор не будет готов. Нулевой тайм-аут соответствует опросу, без блокировки.4849Возвращаемое значение – тройка списков готовых объектов: подмножества первых трех аргументов. Когда тайм-аут истекает без готовности файлового дескриптора, возвращаются три пустых списка.5051Среди допустимых типов объектов в последовательностях – файловые объекты Python (например, `sys.stdin`, или объекты, возвращаемые [`open()`](https://python-all.ru/2.7/library/functions.html#open) или [`os.popen()`](https://python-all.ru/2.7/library/os.html#os.popen)), сокетные объекты, возвращаемые [`socket.socket()`](https://python-all.ru/2.7/library/socket.html#socket.socket). Вы также можете сами определить класс-*обёртку*, при условии, что он имеет соответствующий метод [`fileno()`](https://python-all.ru/2.7/library/io.html#io.IOBase.fileno) (который действительно возвращает файловый дескриптор, а не просто случайное целое число).5253> **Примечание**54>55> Файловые объекты в Windows недопустимы, но сокеты – да. В Windows базовая функция `select()` предоставляется библиотекой WinSock и не обрабатывает файловые дескрипторы, не происходящие из WinSock.5657#### `select.PIPE_BUF`5859Файлы, которые считаются готовыми к записи функциями [`select()`](https://python-all.ru/2.7/library/select.html#module-select), [`poll()`](https://python-all.ru/2.7/library/select.html#select.poll) или подобными интерфейсами в этом модуле, гарантированно не блокируются при записи до [`PIPE_BUF`](https://python-all.ru/2.7/library/select.html#select.select.PIPE_BUF) байт. Это значение гарантируется POSIX как минимум 512. Доступность: Unix.6061Новое в версии 2.7.6263## 16.1.1. Объекты epoll (опроса с фронтальным и уровнем сигналом)6465> [http://linux.die.net/man/4/epoll](https://python-all.ru/2.7/library/select.html)66>67> *eventmask*68>69> | Константа | Значение |70> | --- | --- |71> | `EPOLLIN` | Доступен для чтения |72> | `EPOLLOUT` | Доступен для записи |73> | `EPOLLPRI` | Срочные данные для чтения |74> | `EPOLLERR` | Возникла ошибка на ассоциированном файловом дескрипторе |75> | `EPOLLHUP` | Произошёл разрыв соединения на ассоциированном файловом дескрипторе |76> | `EPOLLET` | Установить триггер по фронту (Edge Trigger), по умолчанию – триггер по уровню (Level Trigger) |77> | `EPOLLONESHOT` | Установить одноразовое поведение. После извлечения одного события файловый дескриптор внутренне отключается. |78> | `EPOLLRDNORM` | Эквивалентно `EPOLLIN` |79> | `EPOLLRDBAND` | Полоса приоритетных данных доступна для чтения. |80> | `EPOLLWRNORM` | Эквивалентно `EPOLLOUT` |81> | `EPOLLWRBAND` | Приоритетные данные могут быть записаны. |82> | `EPOLLMSG` | Игнорируется. |8384#### `epoll.close()`8586Закрывает управляющий файловый дескриптор объекта epoll.8788#### `epoll.fileno()`8990Возвращает номер файлового дескриптора управляющего fd.9192#### `epoll.fromfd(fd)`9394Создает объект epoll из заданного файлового дескриптора.9596#### `epoll.register(fd[, eventmask])`9798Регистрирует файловый дескриптор в объекте epoll.99100> **Примечание**101>102> Регистрация уже зарегистрированного файлового дескриптора вызывает исключение IOError – в отличие от метода register у [Объектов опроса](https://python-all.ru/2.7/library/select.html#poll-objects).103104#### `epoll.modify(fd, eventmask)`105106Изменяет зарегистрированный файловый дескриптор.107108#### `epoll.unregister(fd)`109110Удаляет зарегистрированный файловый дескриптор из объекта epoll.111112#### `epoll.poll([timeout=-1[, maxevents=-1]])`113114Ожидает события. timeout в секундах (float)115116## 16.1.2. Объекты опроса117118Системный вызов `poll()`, поддерживаемый в большинстве Unix-систем, обеспечивает лучшую масштабируемость для сетевых серверов, обслуживающих множество клиентов одновременно. `poll()` масштабируется лучше, поскольку системный вызов требует только перечисления интересующих файловых дескрипторов, тогда как `select()` строит битовую маску, устанавливает биты для нужных файловых дескрипторов, а затем всю битовую маску приходится снова линейно сканировать. `select()` имеет сложность O(наибольший файловый дескриптор), а `poll()` – O(количество файловых дескрипторов).119120#### `poll.register(fd[, eventmask])`121122Регистрирует файловый дескриптор в объекте опроса. Последующие вызовы метода [`poll()`](https://python-all.ru/2.7/library/select.html#select.poll) будут проверять, есть ли у файлового дескриптора ожидающие события ввода-вывода. *fd* может быть целым числом или объектом с методом [`fileno()`](https://python-all.ru/2.7/library/io.html#io.IOBase.fileno), возвращающим целое число. Файловые объекты реализуют `fileno()`, поэтому их тоже можно использовать в качестве аргумента.123124*eventmask* – необязательная битовая маска, описывающая типы событий для проверки. Может быть комбинацией констант `POLLIN`, `POLLPRI` и `POLLOUT`, описанных в таблице ниже. Если не указана, по умолчанию проверяются все три типа событий.125126| Константа | Значение |127| --- | --- |128| `POLLIN` | Есть данные для чтения |129| `POLLPRI` | Есть срочные данные для чтения |130| `POLLOUT` | Готов к выводу: запись не будет блокироваться |131| `POLLERR` | Условие ошибки (какого-либо рода) |132| `POLLHUP` | Разъединение |133| `POLLNVAL` | Некорректный запрос: дескриптор не открыт |134135Регистрация уже зарегистрированного файлового дескриптора не является ошибкой и имеет тот же эффект, как если бы дескриптор был зарегистрирован ровно один раз.136137#### `poll.modify(fd, eventmask)`138139Изменяет уже зарегистрированный fd. Это имеет тот же эффект, что и `register(fd, eventmask)`. Попытка изменить файловый дескриптор, который никогда не был зарегистрирован, приводит к возбуждению исключения [`IOError`](https://python-all.ru/2.7/library/exceptions.html#exceptions.IOError) с errno `ENOENT`.140141Новое в версии 2.6.142143#### `poll.unregister(fd)`144145Удаляет файловый дескриптор, отслеживаемый объектом опроса. Как и метод [`register()`](https://python-all.ru/2.7/library/select.html#select.poll.register), *fd* может быть целым числом или объектом с методом [`fileno()`](https://python-all.ru/2.7/library/io.html#io.IOBase.fileno), возвращающим целое число.146147Попытка удалить файловый дескриптор, который никогда не был зарегистрирован, приводит к возбуждению исключения [`KeyError`](https://python-all.ru/2.7/library/exceptions.html#exceptions.KeyError).148149#### `poll.poll([timeout])`150151Опрашивает набор зарегистрированных файловых дескрипторов и возвращает, возможно, пустой список, содержащий кортежи `(fd, event)` из двух элементов для дескрипторов, по которым есть события или ошибки. *fd* – это файловый дескриптор, а *event* – битовая маска, в которой установлены биты для сообщённых событий этого дескриптора: `POLLIN` для ожидания ввода, `POLLOUT` указывает, что дескриптор можно записывать, и так далее. Пустой список означает, что вызов завершился по таймауту и ни один файловый дескриптор не сообщил о событиях. Если задан *timeout*, он задаёт время в миллисекундах, в течение которого система будет ждать события перед возвратом. Если *timeout* опущен, отрицателен или равен [`None`](https://python-all.ru/2.7/library/constants.html#None), вызов будет блокироваться до появления события для этого объекта poll.152153## 16.1.3. Объекты Kqueue154155#### `kqueue.close()`156157Закрывает файловый дескриптор управления объекта kqueue.158159#### `kqueue.fileno()`160161Возвращает номер файлового дескриптора управляющего fd.162163#### `kqueue.fromfd(fd)`164165Создаёт объект kqueue из заданного файлового дескриптора.166167#### `kqueue.control(changelist, max_events[, timeout]) → eventlist`168169Низкоуровневый интерфейс к kevent170171- changelist должен быть итерируемым объектом, содержащим объекты kevent, или `None`172- max\_events должен быть 0 или положительным целым числом173- тайм-аут в секундах (можно использовать числа с плавающей точкой); по умолчанию `None`, что означает бесконечное ожидание174175## 16.1.4. Объекты Kevent176177[https://www.freebsd.org/cgi/man.cgi?query=kqueue&sektion=2](https://python-all.ru/2.7/library/select.html)178179#### `kevent.ident`180181Значение, используемое для идентификации события. Интерпретация зависит от фильтра, но обычно это файловый дескриптор. В конструкторе ident может быть целым числом или объектом с функцией fileno(). kevent хранит целое число внутренне.182183#### `kevent.filter`184185Имя фильтра ядра.186187| Константа | Значение |188| --- | --- |189| `KQ_FILTER_READ` | Принимает дескриптор и возвращает управление при появлении данных, доступных для чтения |190| `KQ_FILTER_WRITE` | Принимает дескриптор и возвращает управление при появлении возможности записи |191| `KQ_FILTER_AIO` | Запросы AIO |192| `KQ_FILTER_VNODE` | Возвращает управление при наступлении одного или нескольких запрошенных событий, за которыми ведется наблюдение в *fflag* |193| `KQ_FILTER_PROC` | Отслеживание событий по идентификатору процесса |194| `KQ_FILTER_NETDEV` | Отслеживание событий на сетевом устройстве \[недоступно в Mac OS X\] |195| `KQ_FILTER_SIGNAL` | Возвращает управление при доставке отслеживаемого сигнала процессу |196| `KQ_FILTER_TIMER` | Устанавливает произвольный таймер |197198#### `kevent.flags`199200Действие фильтра.201202| Константа | Значение |203| --- | --- |204| `KQ_EV_ADD` | Добавляет или изменяет событие |205| `KQ_EV_DELETE` | Удаляет событие из очереди |206| `KQ_EV_ENABLE` | Позволяет control() вернуть событие |207| `KQ_EV_DISABLE` | Отключает событие |208| `KQ_EV_ONESHOT` | Удаляет событие после первого срабатывания |209| `KQ_EV_CLEAR` | Сбрасывает состояние после извлечения события |210| `KQ_EV_SYSFLAGS` | внутреннее событие |211| `KQ_EV_FLAG1` | внутреннее событие |212| `KQ_EV_EOF` | Условие EOF для конкретного фильтра |213| `KQ_EV_ERROR` | См. возвращаемые значения |214215#### `kevent.fflags`216217Флаги, специфичные для фильтра218219`KQ_FILTER_READ` и `KQ_FILTER_WRITE` флаги фильтра:220221| Константа | Значение |222| --- | --- |223| `KQ_NOTE_LOWAT` | нижняя граница буфера сокета |224225`KQ_FILTER_VNODE` флаги фильтра:226227| Константа | Значение |228| --- | --- |229| `KQ_NOTE_DELETE` | была вызвана *unlink()* |230| `KQ_NOTE_WRITE` | произошла запись |231| `KQ_NOTE_EXTEND` | файл был расширен |232| `KQ_NOTE_ATTRIB` | атрибут был изменён |233| `KQ_NOTE_LINK` | количество ссылок изменилось |234| `KQ_NOTE_RENAME` | файл был переименован |235| `KQ_NOTE_REVOKE` | доступ к файлу был отозван |236237`KQ_FILTER_PROC` флаги фильтра:238239| Константа | Значение |240| --- | --- |241| `KQ_NOTE_EXIT` | процесс завершился |242| `KQ_NOTE_FORK` | процесс вызвал *fork()* |243| `KQ_NOTE_EXEC` | процесс запустил новый процесс |244| `KQ_NOTE_PCTRLMASK` | внутренний флаг фильтра |245| `KQ_NOTE_PDATAMASK` | внутренний флаг фильтра |246| `KQ_NOTE_TRACK` | отслеживать процесс через *fork()* |247| `KQ_NOTE_CHILD` | возвращено в дочернем процессе для *NOTE\_TRACK* |248| `KQ_NOTE_TRACKERR` | не удаётся подключиться к дочернему процессу |249250`KQ_FILTER_NETDEV` флаги фильтра (недоступно в Mac OS X):251252| Константа | Значение |253| --- | --- |254| `KQ_NOTE_LINKUP` | соединение активно |255| `KQ_NOTE_LINKDOWN` | соединение разорвано |256| `KQ_NOTE_LINKINV` | состояние соединения недействительно |257258#### `kevent.data`259260Данные, специфичные для фильтра.261262#### `kevent.udata`263264Значение, определённое пользователем.265