Spec-Zone.ru › Python 3.13

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:
    ...

События разделены на три группы:

Локальные события

Локальные события связаны с нормальным выполнением программы и происходят в чётко определённых местах. Все локальные события могут быть отключены. К локальным событиям относятся:

  • PY_START
  • PY_RESUME
  • PY_RETURN
  • PY_YIELD
  • CALL
  • LINE
  • INSTRUCTION
  • JUMP
  • BRANCH
  • STOP_ITERATION

Дополнительные события

Дополнительные события могут отслеживаться как и другие события, но управляются другим событием:

  • C_RAISE
  • C_RETURN

События C_RETURN и C_RAISE контролируются событием CALL. События C_RETURN и C_RAISE будут видны только в том случае, если отслеживается соответствующее событие CALL.

Другие события

Другие события не обязательно связаны с конкретным местом в программе и не могут быть отключены индивидуально.

Другие отслеживаемые события:

  • PY_THROW
  • PY_UNWIND
  • RAISE
  • EXCEPTION_HANDLED

Событие 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 не используется.

По умолчанию события не активны.

События для каждого объекта кода

События также можно контролировать на основе каждого объекта кода. Функции, определённые ниже и принимающие 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 из функции обратного вызова. Это не изменяет какие события установлены или любые другие расположения кода для того же события.

Отключение событий для определённых расположений очень важно для высокопроизводительного мониторинга. Например, программа может запускаться под отладчиком без накладных расходов, если отладчик отключает весь мониторинг, кроме нескольких точек останова.

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

Особое значение, которое передаётся функции обратного вызова для обозначения отсутствия аргументов вызова.

При возникновении активного события зарегистрированная функция обратного вызова вызывается. Разные события обеспечат функцию обратного вызова различными аргументами, как показано ниже:

  • PY_START и PY_RESUME:

    func(code: CodeType, instruction_offset: int) -> DISABLE | Any
    
  • PY_RETURN и PY_YIELD:

    func(code: CodeType, instruction_offset: int, retval: object) -> DISABLE | Any
    
  • CALL, C_RAISE и C_RETURN:

    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
    
  • BRANCH и JUMP:

    func(code: CodeType, instruction_offset: int, destination_offset: int) -> DISABLE | Any
    

    Обратите внимание, что destination_offset — это то, где код будет выполняться следующим. Для невыполненного ветвления это будет смещение инструкции, следующей за ветвлением.

  • INSTRUCTION:

    func(code: CodeType, instruction_offset: int) -> DISABLE | Any
    

© 2001–2024 Python Software Foundation
Licensed under the PSF License.
https://docs.python.org/3.13/library/sys.monitoring.html

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API