sys.monitoring — Мониторинг событий выполнения
Добавлена в версии 3.12.
Примечание
sys.monitoring — это пространство имён внутри модуля sys, а не независимый модуль, поэтому нет необходимости import sys.monitoring, просто 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.free_tool_id(tool_id: int, /) → None -
Должна быть вызвана, когда инструмент больше не требует tool_id.
Примечание
free_tool_id() не будет отключать глобальные или локальные события, связанные с tool_id, а также не будет отменять регистрацию каких-либо функций обратного вызова. Эта функция предназначена только для уведомления виртуальной машины о том, что конкретный 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 -
Взята (или нет) условная ветвь.
-
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 -
Yield из функции Python (происходит непосредственно перед yield, кадр вызываемой функции будет в стеке).
-
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: ...
События разделены на три группы:
Локальные события
Локальные события связаны с нормальным выполнением программы и происходят в чётко определённых местах. Все локальные события могут быть отключены. К локальным событиям относятся:
Вспомогательные события
Вспомогательные события можно отслеживать, как и другие события, но они управляются другим событием:
События C_RETURN и C_RAISE управляются событием CALL. События C_RETURN и C_RAISE будут видны только если отслеживается соответствующее событие CALL.
Другие события
Другие события необязательно связаны с определённым местом в программе и не могут быть отключены индивидуально.
Другие события, которые можно отслеживать:
Событие STOP_ITERATION
PEP 380 определяет, что исключение StopIteration поднимается при возврате значения из генератора или корутины. Однако это очень неэффективный способ возврата значения, поэтому некоторые реализации Python, в частности CPython 3.12+, не генерируют исключение, если оно не будет видно другим кодом.
Для возможности отслеживания реальных исключений инструментами без замедления генераторов и корутин, предоставляется событие STOP_ITERATION. STOP_ITERATION можно отключить локально, в отличие от RAISE.
Включение и отключение событий
Для отслеживания события, оно должно быть включено, и должен быть зарегистрирован соответствующий обработчик. События можно включать или отключать, устанавливая их глобально или для конкретного объекта кода.
Глобальная настройка событий
События можно контролировать глобально, изменяя набор отслеживаемых событий.
-
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 не используется.
По умолчанию события не активны.
События для каждого объекта кода
События также можно контролировать для каждого объекта кода.
-
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 из функции обратного вызова. Это не изменяет, какие события установлены, или какие-либо другие места кода для того же события.
Отключение событий для определенных мест очень важно для мониторинга высокой производительности. Например, программа может выполняться под отладчиком без накладных расходов, если отладчик отключает весь мониторинг, кроме нескольких точек останова.
-
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(tool_id, event, None).
Функции обратного вызова могут быть зарегистрированы и сняты с регистрации в любое время.
Регистрация или снятие с регистрации функции обратного вызова сгенерирует событие sys.audit().
Аргументы функции обратного вызова
-
sys.monitoring.MISSING -
Специальное значение, передаваемое функции обратного вызова для указания отсутствия аргументов в вызове.
При возникновении активного события зарегистрированная функция обратного вызова вызывается. Различные события будут предоставлять функции обратного вызова различные аргументы следующим образом:
-
func(code: CodeType, instruction_offset: int) -> DISABLE | Any
-
func(code: CodeType, instruction_offset: int, retval: object) -> DISABLE | Any
-
func(code: CodeType, instruction_offset: int, callable: object, arg0: object | MISSING) -> DISABLE | Any
Если аргументов нет, arg0 устанавливается в
sys.monitoring.MISSING. -
RAISE,RERAISE,EXCEPTION_HANDLED,PY_UNWIND,PY_THROWиSTOP_ITERATION:func(code: CodeType, instruction_offset: int, exception: BaseException) -> DISABLE | Any
-
LINE:func(code: CodeType, line_number: int) -> DISABLE | Any
-
func(code: CodeType, instruction_offset: int, destination_offset: int) -> DISABLE | Any
Обратите внимание, что destination_offset — это место, где код будет выполняться в следующий раз. Для невыполненной ветки это будет смещение инструкции, следующей за ветвлением.
-
func(code: CodeType, instruction_offset: int) -> DISABLE | Any
© 2001–2024 Python Software Foundation
Licensed under the PSF License.
https://docs.python.org/3.12/library/sys.monitoring.html