select.md
1> **Источник:** https://python-all.ru/3.8/library/select.html2>3> «Документация Python на русском» – неофициальный перевод официальной документации Python: версии от 2.6 до 3.16, полнотекстовый поиск, английский оригинал рядом с переводом. Эта Markdown-версия страницы предназначена для работы с LLM: вставьте её в ChatGPT, Claude или Cursor.45---67# [`select`](https://python-all.ru/3.8/library/select.html#module-select) – Ожидание завершения ввода-вывода89---1011Этот модуль предоставляет доступ к функциям `select()` и `poll()`, доступным в большинстве операционных систем, `devpoll()` – на Solaris и производных, `epoll()` – на Linux 2.5+ и `kqueue()` – на большинстве BSD. Обратите внимание: в Windows он работает только с сокетами; в других ОС он также работает с другими типами файлов (в частности, в Unix – с каналами). Его нельзя использовать для обычных файлов, чтобы определить, увеличился ли файл с момента последнего чтения.1213> **Примечание**14>15> Модуль [`selectors`](https://python-all.ru/3.8/library/selectors.html#module-selectors) предоставляет высокоуровневую и эффективную мультиплексацию ввода-вывода, построенную на примитивах модуля [`select`](https://python-all.ru/3.8/library/select.html#module-select). Пользователям рекомендуется использовать модуль [`selectors`](https://python-all.ru/3.8/library/selectors.html#module-selectors), если только им не требуется точный контроль над используемыми низкоуровневыми примитивами ОС.1617Модуль определяет следующее:1819#### `exception select.error`2021Устаревший псевдоним [`OSError`](https://python-all.ru/3.8/library/exceptions.html#OSError).2223Изменено в версии 3.3: В соответствии с [**PEP 3151**](https://python-all.ru/3.8/library/select.html) этот класс стал псевдонимом [`OSError`](https://python-all.ru/3.8/library/exceptions.html#OSError).2425#### `select.devpoll()`2627Поддерживается только на Solaris и производных. Возвращает объект `/dev/poll` опроса; см. раздел [/dev/poll Polling Objects](https://python-all.ru/3.8/library/select.html#devpoll-objects) ниже для методов, поддерживаемых объектами devpoll.2829Объекты `devpoll()` привязаны к количеству файловых дескрипторов, разрешённых на момент создания. Если программа уменьшает это значение, `devpoll()` завершится ошибкой. Если программа увеличивает это значение, `devpoll()` может вернуть неполный список активных файловых дескрипторов.3031Новый файловый дескриптор является [ненаследуемым](https://python-all.ru/3.8/library/os.html#fd-inheritance).3233Новое в версии 3.3.3435Изменено в версии 3.4: Новый файловый дескриптор теперь не наследуется.3637#### `select.epoll(sizehint=-1, flags=0)`3839Поддерживается только на Linux 2.5.44 и новее. Возвращает объект опроса, работающий по фронту (edge polling), который можно использовать как интерфейс с триггером по фронту или уровню для событий ввода-вывода.4041Параметр *sizehint* сообщает epoll ожидаемое количество регистрируемых событий. Он должен быть положительным, либо *-1* для использования значения по умолчанию. Он используется только в старых системах, где `epoll_create1()` недоступен; в противном случае он не имеет эффекта (хотя его значение по-прежнему проверяется).4243Параметр *flags* устарел и полностью игнорируется. Однако, если он указан, его значение должно быть `0` или `select.EPOLL_CLOEXEC`, иначе возбуждается `OSError`.4445См. раздел [Edge and Level Trigger Polling (epoll) Objects](https://python-all.ru/3.8/library/select.html#epoll-objects) ниже для методов, поддерживаемых объектами epoll.4647Объекты `epoll` поддерживают протокол менеджера контекста: при использовании в инструкции [`with`](https://python-all.ru/3.8/reference/compound_stmts.html#with) новый файловый дескриптор автоматически закрывается в конце блока.4849Новый файловый дескриптор является [ненаследуемым](https://python-all.ru/3.8/library/os.html#fd-inheritance).5051Изменено в версии 3.3: Добавлен параметр *flags*.5253Изменено в версии 3.4: Добавлена поддержка инструкции [`with`](https://python-all.ru/3.8/reference/compound_stmts.html#with). Теперь новый файловый дескриптор является ненаследуемым.5455Устарело с версии 3.4: Параметр *flags*. Теперь по умолчанию используется `select.EPOLL_CLOEXEC`. Используйте [`os.set_inheritable()`](https://python-all.ru/3.8/library/os.html#os.set_inheritable), чтобы сделать файловый дескриптор наследуемым.5657#### `select.poll()`5859Поддерживается не всеми операционными системами. Возвращает объект опроса, который поддерживает регистрацию и отмену регистрации файловых дескрипторов, а затем опрос их на предмет событий ввода-вывода; см. раздел [Polling Objects](https://python-all.ru/3.8/library/select.html#poll-objects) ниже для методов, поддерживаемых объектами опроса.6061#### `select.kqueue()`6263Поддерживается только на BSD. Возвращает объект очереди ядра; см. раздел [Kqueue Objects](https://python-all.ru/3.8/library/select.html#kqueue-objects) ниже для методов, поддерживаемых объектами kqueue.6465Новый файловый дескриптор является [ненаследуемым](https://python-all.ru/3.8/library/os.html#fd-inheritance).6667Изменено в версии 3.4: Новый файловый дескриптор теперь не наследуется.6869#### `select.kevent(ident, filter=KQ_FILTER_READ, flags=KQ_EV_ADD, fflags=0, data=0, udata=0)`7071Поддерживается только на BSD. Возвращает объект события ядра; см. раздел [Kevent Objects](https://python-all.ru/3.8/library/select.html#kevent-objects) ниже для методов, поддерживаемых объектами kevent.7273#### `select.select(rlist, wlist, xlist[, timeout])`7475Это простой интерфейс к системному вызову `select()` Unix. Первые три аргумента – это итерируемые объекты «ожидаемых объектов»: целые числа, представляющие файловые дескрипторы, или объекты с методом без параметров с именем [`fileno()`](https://python-all.ru/3.8/library/io.html#io.IOBase.fileno), возвращающим такое целое число:7677- *rlist*: ожидать готовности к чтению78- *wlist*: ожидать готовности к записи79- *xlist*: ожидать «исключительного условия» (см. справочную страницу для того, что ваша система считает таким условием)8081Пустые итерируемые объекты допускаются, но принятие трёх пустых итерируемых объектов зависит от платформы. (Известно, что это работает на Unix, но не на Windows.) Необязательный аргумент *timeout* задаёт тайм-аут в виде числа с плавающей точкой в секундах. Если аргумент *timeout* опущен, функция блокируется до тех пор, пока хотя бы один файловый дескриптор не будет готов. Значение тайм-аута, равное нулю, означает опрос и никогда не блокируется.8283Возвращаемое значение – тройка списков готовых объектов: подмножества первых трех аргументов. Когда тайм-аут истекает без готовности файлового дескриптора, возвращаются три пустых списка.8485Среди допустимых типов объектов в итерируемых – [файловые объекты](https://python-all.ru/3.8/glossary.html#term-file-object) Python (например, `sys.stdin` или объекты, возвращаемые [`open()`](https://python-all.ru/3.8/library/functions.html#open) или [`os.popen()`](https://python-all.ru/3.8/library/os.html#os.popen)), сокетные объекты, возвращаемые [`socket.socket()`](https://python-all.ru/3.8/library/socket.html#socket.socket). Вы также можете самостоятельно определить *класс-обёртку*, если он имеет подходящий метод [`fileno()`](https://python-all.ru/3.8/library/io.html#io.IOBase.fileno) (который действительно возвращает файловый дескриптор, а не случайное целое число).8687> **Примечание**88>89> Файловые объекты в Windows недопустимы, но сокеты – да. В Windows базовая функция `select()` предоставляется библиотекой WinSock и не обрабатывает файловые дескрипторы, не происходящие из WinSock.9091Изменено в версии 3.5: Функция теперь повторяется с пересчитанным тайм-аутом при прерывании сигналом, за исключением случая, когда обработчик сигнала вызывает исключение (см. [**PEP 475**](https://python-all.ru/3.8/library/select.html) для обоснования), вместо вызова [`InterruptedError`](https://python-all.ru/3.8/library/exceptions.html#InterruptedError).9293#### `select.PIPE_BUF`9495Минимальное количество байт, которое можно записать в канал без блокировки, когда канал сообщён как готовый к записи с помощью [`select()`](https://python-all.ru/3.8/library/select.html#select.select), [`poll()`](https://python-all.ru/3.8/library/select.html#select.poll) или другого интерфейса в этом модуле. Это не относится к другим файлоподобным объектам, таким как сокеты.9697Это значение гарантируется POSIX равным не менее 512.9899[Доступность](https://python-all.ru/3.8/library/intro.html#availability): Unix100101Новое в версии 3.2.102103## `/dev/poll` Объекты опроса104105Solaris и их производные имеют `/dev/poll`. В то время как `select()` работает за O(наибольший файловый дескриптор), а `poll()` – за O(количество файловых dескрипторов), `/dev/poll` работает за O(активные файловые дескрипторы).106107Поведение `/dev/poll` очень близко к стандартному объекту `poll()`.108109#### `devpoll.close()`110111Закрывает файловый дескриптор объекта опроса.112113Новое в версии 3.4.114115#### `devpoll.closed`116117`True` если объект опроса закрыт.118119Новое в версии 3.4.120121#### `devpoll.fileno()`122123Возвращает номер файлового дескриптора объекта опроса.124125Новое в версии 3.4.126127#### `devpoll.register(fd[, eventmask])`128129Регистрирует файловый дескриптор в объекте опроса. Последующие вызовы метода [`poll()`](https://python-all.ru/3.8/library/select.html#select.poll) будут проверять, есть ли у файлового дескриптора ожидающие события ввода-вывода. *fd* может быть целым числом или объектом с методом [`fileno()`](https://python-all.ru/3.8/library/io.html#io.IOBase.fileno), возвращающим целое число. Файловые объекты реализуют `fileno()`, поэтому их тоже можно использовать в качестве аргумента.130131*eventmask* – необязательная битовая маска, описывающая тип событий для проверки. Константы те же, что и у объекта `poll()`. Значение по умолчанию – комбинация констант `POLLIN`, `POLLPRI` и `POLLOUT`.132133> **Предупреждение**134>135> Регистрация уже зарегистрированного файлового дескриптора не является ошибкой, но результат не определен. Правильным действием будет сначала отменить регистрацию или изменить его. Это важное отличие от `poll()`.136137#### `devpoll.modify(fd[, eventmask])`138139Этот метод выполняет [`unregister()`](https://python-all.ru/3.8/library/select.html#select.devpoll.unregister), а затем [`register()`](https://python-all.ru/3.8/library/select.html#select.devpoll.register). Это (немного) эффективнее, чем делать то же самое явно.140141#### `devpoll.unregister(fd)`142143Удаляет файловый дескриптор, отслеживаемый объектом опроса. Как и метод [`register()`](https://python-all.ru/3.8/library/select.html#select.devpoll.register), *fd* может быть целым числом или объектом с методом [`fileno()`](https://python-all.ru/3.8/library/io.html#io.IOBase.fileno), возвращающим целое число.144145Попытка удалить файловый дескриптор, который никогда не был зарегистрирован, безопасно игнорируется.146147#### `devpoll.poll([timeout])`148149Опрашивает набор зарегистрированных файловых дескрипторов и возвращает, возможно, пустой список, содержащий кортежи `(fd, event)` из двух элементов для дескрипторов, по которым есть события или ошибки. *fd* – это файловый дескриптор, а *event* – битовая маска, в которой установлены биты для сообщённых событий этого дескриптора: `POLLIN` для ожидания ввода, `POLLOUT` указывает, что дескриптор можно записывать, и так далее. Пустой список означает, что вызов завершился по таймауту и ни один файловый дескриптор не сообщил о событиях. Если задан *timeout*, он задаёт время в миллисекундах, в течение которого система будет ждать события перед возвратом. Если *timeout* опущен, равен -1 или [`None`](https://python-all.ru/3.8/library/constants.html#None), вызов будет блокироваться до появления события для этого объекта poll.150151Изменено в версии 3.5: Функция теперь повторяется с пересчитанным тайм-аутом при прерывании сигналом, за исключением случая, когда обработчик сигнала вызывает исключение (см. [**PEP 475**](https://python-all.ru/3.8/library/select.html) для обоснования), вместо вызова [`InterruptedError`](https://python-all.ru/3.8/library/exceptions.html#InterruptedError).152153## Объекты опроса с триггером по фронту и уровню (epoll)154155> [https://linux.die.net/man/4/epoll](https://python-all.ru/3.8/library/select.html)156>157> *eventmask*158>159> | Константа | Значение |160> | --- | --- |161> | `EPOLLIN` | Доступен для чтения |162> | `EPOLLOUT` | Доступен для записи |163> | `EPOLLPRI` | Срочные данные для чтения |164> | `EPOLLERR` | Возникла ошибка на ассоциированном файловом дескрипторе |165> | `EPOLLHUP` | Произошёл разрыв соединения на ассоциированном файловом дескрипторе |166> | `EPOLLET` | Установить триггер по фронту (Edge Trigger), по умолчанию – триггер по уровню (Level Trigger) |167> | `EPOLLONESHOT` | Установить одноразовое поведение. После извлечения одного события файловый дескриптор внутренне отключается. |168> | `EPOLLEXCLUSIVE` | Пробуждать только один объект epoll, когда связанный fd имеет событие. По умолчанию (если этот флаг не установлен) пробуждаются все объекты epoll, ожидающие на fd. |169> | `EPOLLRDHUP` | Потоковый сокет: удаленная сторона закрыла соединение или завершила записывающую половину соединения. |170> | `EPOLLRDNORM` | Эквивалентно `EPOLLIN` |171> | `EPOLLRDBAND` | Полоса приоритетных данных доступна для чтения. |172> | `EPOLLWRNORM` | Эквивалентно `EPOLLOUT` |173> | `EPOLLWRBAND` | Приоритетные данные могут быть записаны. |174> | `EPOLLMSG` | Игнорируется. |175>176> Новое в версии 3.6: `EPOLLEXCLUSIVE` был добавлен. Поддерживается только ядром Linux 4.5 или новее.177178#### `epoll.close()`179180Закрывает управляющий файловый дескриптор объекта epoll.181182#### `epoll.closed`183184`True`, если объект epoll закрыт.185186#### `epoll.fileno()`187188Возвращает номер файлового дескриптора управляющего fd.189190#### `epoll.fromfd(fd)`191192Создает объект epoll из заданного файлового дескриптора.193194#### `epoll.register(fd[, eventmask])`195196Регистрирует файловый дескриптор в объекте epoll.197198#### `epoll.modify(fd, eventmask)`199200Изменяет зарегистрированный файловый дескриптор.201202#### `epoll.unregister(fd)`203204Удаляет зарегистрированный файловый дескриптор из объекта epoll.205206#### `epoll.poll(timeout=None, maxevents=-1)`207208Ожидает события. timeout в секундах (float)209210Изменено в версии 3.5: Функция теперь повторяется с пересчитанным тайм-аутом при прерывании сигналом, за исключением случая, когда обработчик сигнала вызывает исключение (см. [**PEP 475**](https://python-all.ru/3.8/library/select.html) для обоснования), вместо вызова [`InterruptedError`](https://python-all.ru/3.8/library/exceptions.html#InterruptedError).211212## Объекты опроса213214Системный вызов `poll()`, поддерживаемый в большинстве Unix-систем, обеспечивает лучшую масштабируемость для сетевых серверов, обслуживающих множество клиентов одновременно. `poll()` масштабируется лучше, поскольку системный вызов требует только перечисления интересующих файловых дескрипторов, тогда как `select()` строит битовую маску, устанавливает биты для нужных файловых дескрипторов, а затем всю битовую маску приходится снова линейно сканировать. `select()` имеет сложность O(наибольший файловый дескриптор), а `poll()` – O(количество файловых дескрипторов).215216#### `poll.register(fd[, eventmask])`217218Регистрирует файловый дескриптор в объекте опроса. Последующие вызовы метода [`poll()`](https://python-all.ru/3.8/library/select.html#select.poll) будут проверять, есть ли у файлового дескриптора ожидающие события ввода-вывода. *fd* может быть целым числом или объектом с методом [`fileno()`](https://python-all.ru/3.8/library/io.html#io.IOBase.fileno), возвращающим целое число. Файловые объекты реализуют `fileno()`, поэтому их тоже можно использовать в качестве аргумента.219220*eventmask* – необязательная битовая маска, описывающая типы событий для проверки. Может быть комбинацией констант `POLLIN`, `POLLPRI` и `POLLOUT`, описанных в таблице ниже. Если не указана, по умолчанию проверяются все три типа событий.221222| Константа | Значение |223| --- | --- |224| `POLLIN` | Есть данные для чтения |225| `POLLPRI` | Есть срочные данные для чтения |226| `POLLOUT` | Готов к выводу: запись не будет блокироваться |227| `POLLERR` | Условие ошибки (какого-либо рода) |228| `POLLHUP` | Разъединение |229| `POLLRDHUP` | Потоковый сокет: удаленная сторона закрыла соединение или закрыла запись в половине соединения |230| `POLLNVAL` | Некорректный запрос: дескриптор не открыт |231232Регистрация уже зарегистрированного файлового дескриптора не является ошибкой и имеет тот же эффект, как если бы дескриптор был зарегистрирован ровно один раз.233234#### `poll.modify(fd, eventmask)`235236Изменяет уже зарегистрированный fd. Это имеет тот же эффект, что и `register(fd, eventmask)`. Попытка изменить файловый дескриптор, который никогда не был зарегистрирован, приводит к возбуждению исключения [`OSError`](https://python-all.ru/3.8/library/exceptions.html#OSError) с errno `ENOENT`.237238#### `poll.unregister(fd)`239240Удаляет файловый дескриптор, отслеживаемый объектом опроса. Как и метод [`register()`](https://python-all.ru/3.8/library/select.html#select.poll.register), *fd* может быть целым числом или объектом с методом [`fileno()`](https://python-all.ru/3.8/library/io.html#io.IOBase.fileno), возвращающим целое число.241242Попытка удалить файловый дескриптор, который никогда не был зарегистрирован, приводит к возбуждению исключения [`KeyError`](https://python-all.ru/3.8/library/exceptions.html#KeyError).243244#### `poll.poll([timeout])`245246Опрашивает набор зарегистрированных файловых дескрипторов и возвращает, возможно, пустой список, содержащий кортежи `(fd, event)` из двух элементов для дескрипторов, по которым есть события или ошибки. *fd* – это файловый дескриптор, а *event* – битовая маска, в которой установлены биты для сообщённых событий этого дескриптора: `POLLIN` для ожидания ввода, `POLLOUT` указывает, что дескриптор можно записывать, и так далее. Пустой список означает, что вызов завершился по таймауту и ни один файловый дескриптор не сообщил о событиях. Если задан *timeout*, он задаёт время в миллисекундах, в течение которого система будет ждать события перед возвратом. Если *timeout* опущен, отрицателен или равен [`None`](https://python-all.ru/3.8/library/constants.html#None), вызов будет блокироваться до появления события для этого объекта poll.247248Изменено в версии 3.5: Функция теперь повторяется с пересчитанным тайм-аутом при прерывании сигналом, за исключением случая, когда обработчик сигнала вызывает исключение (см. [**PEP 475**](https://python-all.ru/3.8/library/select.html) для обоснования), вместо вызова [`InterruptedError`](https://python-all.ru/3.8/library/exceptions.html#InterruptedError).249250## Объекты Kqueue251252#### `kqueue.close()`253254Закрывает файловый дескриптор управления объекта kqueue.255256#### `kqueue.closed`257258`True`, если объект kqueue закрыт.259260#### `kqueue.fileno()`261262Возвращает номер файлового дескриптора управляющего fd.263264#### `kqueue.fromfd(fd)`265266Создаёт объект kqueue из заданного файлового дескриптора.267268#### `kqueue.control(changelist, max_events[, timeout]) → eventlist`269270Низкоуровневый интерфейс к kevent271272- changelist должен быть итерируемым объектом, содержащим объекты kevent, или `None`273- max\_events должен быть 0 или положительным целым числом274- тайм-аут в секундах (можно использовать числа с плавающей точкой); по умолчанию `None`, что означает бесконечное ожидание275276Изменено в версии 3.5: Функция теперь повторяется с пересчитанным тайм-аутом при прерывании сигналом, за исключением случая, когда обработчик сигнала вызывает исключение (см. [**PEP 475**](https://python-all.ru/3.8/library/select.html) для обоснования), вместо вызова [`InterruptedError`](https://python-all.ru/3.8/library/exceptions.html#InterruptedError).277278## Объекты Kevent279280[https://www.freebsd.org/cgi/man.cgi?query=kqueue&sektion=2](https://python-all.ru/3.8/library/select.html)281282#### `kevent.ident`283284Значение, используемое для идентификации события. Интерпретация зависит от фильтра, но обычно это файловый дескриптор. В конструкторе ident может быть либо целым числом, либо объектом с методом [`fileno()`](https://python-all.ru/3.8/library/io.html#io.IOBase.fileno). kevent хранит целое число внутри.285286#### `kevent.filter`287288Имя фильтра ядра.289290| Константа | Значение |291| --- | --- |292| `KQ_FILTER_READ` | Принимает дескриптор и возвращает управление при появлении данных, доступных для чтения |293| `KQ_FILTER_WRITE` | Принимает дескриптор и возвращает управление при появлении возможности записи |294| `KQ_FILTER_AIO` | Запросы AIO |295| `KQ_FILTER_VNODE` | Возвращает управление при наступлении одного или нескольких запрошенных событий, за которыми ведется наблюдение в *fflag* |296| `KQ_FILTER_PROC` | Отслеживание событий по идентификатору процесса |297| `KQ_FILTER_NETDEV` | Отслеживание событий на сетевом устройстве \[недоступно в Mac OS X\] |298| `KQ_FILTER_SIGNAL` | Возвращает управление при доставке отслеживаемого сигнала процессу |299| `KQ_FILTER_TIMER` | Устанавливает произвольный таймер |300301#### `kevent.flags`302303Действие фильтра.304305| Константа | Значение |306| --- | --- |307| `KQ_EV_ADD` | Добавляет или изменяет событие |308| `KQ_EV_DELETE` | Удаляет событие из очереди |309| `KQ_EV_ENABLE` | Позволяет control() вернуть событие |310| `KQ_EV_DISABLE` | Отключает событие |311| `KQ_EV_ONESHOT` | Удаляет событие после первого срабатывания |312| `KQ_EV_CLEAR` | Сбрасывает состояние после извлечения события |313| `KQ_EV_SYSFLAGS` | внутреннее событие |314| `KQ_EV_FLAG1` | внутреннее событие |315| `KQ_EV_EOF` | Условие EOF для конкретного фильтра |316| `KQ_EV_ERROR` | См. возвращаемые значения |317318#### `kevent.fflags`319320Флаги, специфичные для фильтра321322`KQ_FILTER_READ` и `KQ_FILTER_WRITE` флаги фильтра:323324| Константа | Значение |325| --- | --- |326| `KQ_NOTE_LOWAT` | нижняя граница буфера сокета |327328`KQ_FILTER_VNODE` флаги фильтра:329330| Константа | Значение |331| --- | --- |332| `KQ_NOTE_DELETE` | была вызвана *unlink()* |333| `KQ_NOTE_WRITE` | произошла запись |334| `KQ_NOTE_EXTEND` | файл был расширен |335| `KQ_NOTE_ATTRIB` | атрибут был изменён |336| `KQ_NOTE_LINK` | количество ссылок изменилось |337| `KQ_NOTE_RENAME` | файл был переименован |338| `KQ_NOTE_REVOKE` | доступ к файлу был отозван |339340`KQ_FILTER_PROC` флаги фильтра:341342| Константа | Значение |343| --- | --- |344| `KQ_NOTE_EXIT` | процесс завершился |345| `KQ_NOTE_FORK` | процесс вызвал *fork()* |346| `KQ_NOTE_EXEC` | процесс запустил новый процесс |347| `KQ_NOTE_PCTRLMASK` | внутренний флаг фильтра |348| `KQ_NOTE_PDATAMASK` | внутренний флаг фильтра |349| `KQ_NOTE_TRACK` | отслеживать процесс через *fork()* |350| `KQ_NOTE_CHILD` | возвращено в дочернем процессе для *NOTE\_TRACK* |351| `KQ_NOTE_TRACKERR` | не удаётся подключиться к дочернему процессу |352353`KQ_FILTER_NETDEV` флаги фильтра (недоступно в Mac OS X):354355| Константа | Значение |356| --- | --- |357| `KQ_NOTE_LINKUP` | соединение активно |358| `KQ_NOTE_LINKDOWN` | соединение разорвано |359| `KQ_NOTE_LINKINV` | состояние соединения недействительно |360361#### `kevent.data`362363Данные, специфичные для фильтра.364365#### `kevent.udata`366367Значение, определённое пользователем.368