sys.monitoring — Мониторинг событий выполнения
Добавлено в версии 3.12.
Примечание
sys.monitoring — это пространство имён внутри модуля sys, а не независимый модуль, и вызов import sys.monitoring завершится ошибкой ModuleNotFoundError. Вместо этого просто выполните import sys, а затем используйте sys.monitoring.
Это пространство имён предоставляет доступ к функциям и константам, необходимым для активации и управления мониторингом событий.
Во время выполнения программ происходят события, которые могут представлять интерес для инструментов мониторинга выполнения. Пространство имён sys.monitoring позволяет получать обратные вызовы при возникновении интересующих событий.
API мониторинга состоит из трёх компонентов:
Идентификаторы инструментов
Идентификатор инструмента — это целое число и связанное с ним имя. Идентификаторы инструментов используются, чтобы инструменты не мешали друг другу и могли работать одновременно. В настоящее время инструменты полностью независимы и не могут использоваться для мониторинга друг друга. Возможно, в будущем это ограничение будет снято.
Перед регистрацией или активацией событий инструменту следует выбрать идентификатор. Идентификаторы — это целые числа в диапазоне от 0 до 5 включительно.
Регистрация и использование инструментов
-
sys.monitoring.use_tool_id(tool_id: int, name: str, /) → None -
Эту функцию необходимо вызвать, прежде чем можно будет использовать tool_id. Значение tool_id должно находиться в диапазоне от 0 до 5 включительно. Вызывает исключение
ValueError, если tool_id уже используется.
-
sys.monitoring.clear_tool_id(tool_id: int, /) → None -
Отменяет регистрацию всех событий и функций обратного вызова, связанных с tool_id.
-
sys.monitoring.free_tool_id(tool_id: int, /) → None -
Эту функцию следует вызвать, когда инструменту больше не требуется tool_id. Перед освобождением tool_id будет вызвана функция
clear_tool_id().
-
sys.monitoring.get_tool(tool_id: int, /) → str | None -
Возвращает имя инструмента, если tool_id используется, иначе возвращает
None. Значение tool_id должно находиться в диапазоне от 0 до 5 включительно.
Виртуальная машина обрабатывает все идентификаторы одинаково в отношении событий, однако следующие идентификаторы предопределены, чтобы упростить совместную работу инструментов:
sys.monitoring.DEBUGGER_ID = 0 sys.monitoring.COVERAGE_ID = 1 sys.monitoring.PROFILER_ID = 2 sys.monitoring.OPTIMIZER_ID = 5
События
Поддерживаются следующие события:
-
sys.monitoring.events.BRANCH_LEFT -
Условный переход выполняется влево.
Способ представления ветвей «влево» и «вправо» выбирает инструмент. Не гарантируется, какая ветвь будет «левой», а какая «правой», но на протяжении выполнения программы это соответствие остаётся неизменным.
-
sys.monitoring.events.BRANCH_RIGHT -
Условный переход выполняется вправо.
-
sys.monitoring.events.CALL -
Вызов в коде Python (событие возникает до вызова).
-
sys.monitoring.events.C_RAISE -
Исключение, вызванное любым вызываемым объектом, кроме функций Python (событие возникает после выхода).
-
sys.monitoring.events.C_RETURN -
Возврат из любого вызываемого объекта, кроме функций Python (событие возникает после возврата).
-
sys.monitoring.events.EXCEPTION_HANDLED -
Исключение обработано.
-
sys.monitoring.events.INSTRUCTION -
Скоро будет выполнена инструкция виртуальной машины.
-
sys.monitoring.events.JUMP -
В графе потока управления выполняется безусловный переход.
-
sys.monitoring.events.LINE -
Скоро будет выполнена инструкция, номер строки которой отличается от номера строки предыдущей инструкции.
-
sys.monitoring.events.PY_RESUME -
Возобновление функции Python (для функций-генераторов и сопрограмм), кроме вызовов
throw().
-
sys.monitoring.events.PY_RETURN -
Возврат из функции Python (событие возникает непосредственно перед возвратом; кадр вызываемой функции будет находиться в стеке).
-
sys.monitoring.events.PY_START -
Начало выполнения функции Python (событие возникает непосредственно после вызова; кадр вызываемой функции будет находиться в стеке).
-
sys.monitoring.events.PY_THROW -
Функция Python возобновляется вызовом
throw().
-
sys.monitoring.events.PY_UNWIND -
Выход из функции Python при раскрутке стека исключений. Сюда входят исключения, непосредственно вызванные внутри функции и распространяющиеся дальше.
-
sys.monitoring.events.PY_YIELD -
Выдача значения функцией Python (событие возникает непосредственно перед выдачей; кадр вызываемой функции будет находиться в стеке).
-
sys.monitoring.events.RAISE -
Возникает исключение, кроме тех случаев, которые вызывают событие
STOP_ITERATION.
-
sys.monitoring.events.RERAISE -
Исключение вызывается повторно, например в конце блока
finally.
-
sys.monitoring.events.STOP_ITERATION -
Вызывается искусственное исключение
StopIteration; см. событие STOP_ITERATION.
В будущем могут быть добавлены другие события.
Эти события являются атрибутами пространства имён sys.monitoring.events. Каждое событие представлено целочисленной константой, являющейся степенью двойки. Чтобы задать набор событий, достаточно выполнить побитовое ИЛИ для отдельных событий. Например, чтобы указать события PY_RETURN и PY_START, используйте выражение PY_RETURN | PY_START.
-
sys.monitoring.events.NO_EVENTS -
Псевдоним для
0, позволяющий пользователям выполнять явные сравнения, например:if get_events(DEBUGGER_ID) == NO_EVENTS: ...Установка этого события отключает все события.
Локальные события
Локальные события связаны с обычным выполнением программы и происходят в чётко определённых местах. Все локальные события можно отключить. К локальным событиям относятся:
Устаревшее событие
BRANCH
Событие BRANCH устарело начиная с версии 3.14. Использование событий BRANCH_LEFT и BRANCH_RIGHT обеспечивает значительно более высокую производительность, поскольку их можно отключать независимо друг от друга.
Вспомогательные события
Вспомогательные события можно отслеживать так же, как и другие события, но управляются они другим событием:
События C_RETURN и C_RAISE управляются событием CALL. События C_RETURN и C_RAISE будут видны только в том случае, если отслеживается соответствующее событие CALL.
Другие события
Другие события не обязательно связаны с конкретным местом в программе, и их нельзя отключить по отдельности с помощью DISABLE.
К другим событиям, которые можно отслеживать, относятся:
Событие STOP_ITERATION
PEP 380 устанавливает, что при возврате значения из генератора или сопрограммы вызывается исключение StopIteration. Однако это очень неэффективный способ возврата значения, поэтому некоторые реализации Python, в частности CPython 3.12+, не вызывают исключение, если оно не будет видимым для другого кода.
Чтобы инструменты могли отслеживать настоящие исключения, не замедляя генераторы и сопрограммы, предусмотрено событие STOP_ITERATION. STOP_ITERATION можно отключить локально, в отличие от RAISE.
Обратите внимание: событие STOP_ITERATION и событие RAISE для исключения StopIteration эквивалентны и при генерации событий считаются взаимозаменяемыми. По соображениям производительности реализации будут отдавать предпочтение STOP_ITERATION, но могут генерировать событие RAISE с помощью StopIteration.
Включение и отключение событий
Для мониторинга события его необходимо включить и зарегистрировать соответствующий обратный вызов. События можно включать и отключать глобально и/или для конкретного объекта кода. Событие будет вызывать обратный вызов только один раз, даже если оно включено и глобально, и локально.
Глобальная настройка событий
Событиями можно управлять глобально, изменяя набор отслеживаемых событий.
-
sys.monitoring.get_events(tool_id: int, /) → int -
Возвращает
int, представляющий все активные события.
-
sys.monitoring.set_events(tool_id: int, event_set: int, /) → None -
Активирует все события, заданные в event_set. Вызывает исключение
ValueError, если tool_id не используется.
По умолчанию события не активны.
События для отдельных объектов кода
Событиями также можно управлять отдельно для каждого объекта кода. Функции, определённые ниже и принимающие types.CodeType, должны быть готовы принимать объект, подобный ему, от функций, определённых не на Python (см. API мониторинга C).
-
sys.monitoring.get_local_events(tool_id: int, code: CodeType, /) → int -
Возвращает все локальные события для code.
-
sys.monitoring.set_local_events(tool_id: int, code: CodeType, event_set: int, /) → None -
Активирует все локальные события для code, заданные в event_set. Вызывает исключение
ValueError, если tool_id не используется.
Отключение событий
-
sys.monitoring.DISABLE -
Специальное значение, которое можно вернуть из функции обратного вызова, чтобы отключить события для текущего местоположения в коде.
Локальные события можно отключить для конкретного местоположения в коде, вернув из функции обратного вызова sys.monitoring.DISABLE. Это не изменяет набор включённых событий и не влияет на другие местоположения для того же события.
Отключение событий для конкретных местоположений очень важно для высокопроизводительного мониторинга. Например, программу можно запустить в отладчике без накладных расходов, если отладчик отключит мониторинг везде, кроме нескольких точек останова.
Если функция обратного вызова для глобального события возвращает DISABLE, интерпретатор вызовет исключение ValueError в неопределённом месте (то есть трассировка стека предоставлена не будет).
-
sys.monitoring.restart_events() → None -
Включает все события, отключённые с помощью
sys.monitoring.DISABLEдля всех инструментов.
Регистрация функций обратного вызова
-
sys.monitoring.register_callback(tool_id: int, event: int, func: Callable | None, /) → Callable | None -
Регистрирует вызываемый объект func для события event с указанным идентификатором tool_id.
Если для заданных tool_id и event уже зарегистрирован другой обратный вызов, его регистрация отменяется, и он возвращается. В противном случае
register_callback()возвращаетNone.Вызывает событие аудита
sys.monitoring.register_callbackс аргументомfunc.
Регистрацию функций можно отменить вызовом sys.monitoring.register_callback(tool_id, event, None).
Функции обратного вызова можно регистрировать и удалять в любое время.
Функции обратного вызова вызываются только один раз, независимо от того, включено ли событие и глобально, и локально. Поэтому, если ваш код может включить событие и для глобальных, и для локальных событий, функция обратного вызова должна обрабатывать оба варианта вызова.
Аргументы функций обратного вызова
-
sys.monitoring.MISSING -
Специальное значение, передаваемое функции обратного вызова, чтобы указать, что у вызова нет аргументов.
При возникновении активного события вызывается зарегистрированная функция обратного вызова. Возвращаемый ею объект не влияет на результат, если это не DISABLE. Разные события передают функции обратного вызова разные аргументы:
-
func(code: CodeType, instruction_offset: int) -> object
-
func(code: CodeType, instruction_offset: int, retval: object) -> object
-
CALL,C_RAISEиC_RETURN(в частности, arg0 может быть равенMISSING):func(code: CodeType, instruction_offset: int, callable: object, arg0: object) -> object
code — это объект кода, в котором выполняется вызов, а callable — объект, который собираются вызвать (и который, таким образом, вызвал событие). Если аргументов нет, arg0 присваивается значение
sys.monitoring.MISSING.Для методов экземпляра callable будет объектом функции, найденным в классе, а arg0 будет содержать экземпляр (то есть аргумент
selfметода). -
RAISE,RERAISE,EXCEPTION_HANDLED,PY_UNWIND,PY_THROWиSTOP_ITERATION:func(code: CodeType, instruction_offset: int, exception: BaseException) -> object
-
LINE:func(code: CodeType, line_number: int) -> object
-
BRANCH_LEFT,BRANCH_RIGHTиJUMP:func(code: CodeType, instruction_offset: int, destination_offset: int) -> object
Обратите внимание: destination_offset — это место, где будет выполнена следующая инструкция кода.
-
func(code: CodeType, instruction_offset: int) -> object
© 2001 Python Software Foundation
Licensed under the PSF License.
https://docs.python.org/3.14/library/sys.monitoring.html