Spec-Zone.ru › Python 3.14

Интроспекция графа вызовов

Исходный код: Lib/asyncio/graph.py

asyncio предоставляет мощные средства интроспекции графа вызовов во время выполнения, позволяющие отслеживать весь граф вызовов работающей сопрограммы или задачи, а также приостановленного объекта Future. Эти средства и лежащие в их основе механизмы можно использовать из программы на Python или во внешних профилировщиках и отладчиках.

См. также

Инструменты интроспекции командной строки

Инструменты командной строки для проверки задач в другом работающем процессе Python.

Добавлено в версии 3.14.

asyncio.print_call_graph(future=None, /, *, file=None, depth=1, limit=None)

Вывести граф асинхронных вызовов для текущей задачи или переданного Task либо Future.

Функция выводит записи, начиная с верхнего фрейма и продвигаясь вниз к точке вызова.

Функция принимает необязательный аргумент future. Если он не передан, используется текущая работающая задача.

Если функция вызвана для текущей задачи, необязательный аргумент только для ключевого слова depth позволяет пропустить указанное количество фреймов в начале стека.

Если указан необязательный аргумент только для ключевого слова limit, каждый стек вызовов в результирующем графе усекается так, чтобы содержать не более abs(limit) записей. Если значение limit положительное, остаются записи, ближайшие к точке вызова. Если значение limit отрицательное, остаются самые верхние записи. Если аргумент limit не указан или равен None, выводятся все записи. Если значение limit равно 0, стек вызовов вообще не выводится — выводится только информация «ожидается объектом».

Если аргумент file не указан или равен None, функция выводит данные в sys.stdout.

Пример:

Следующий код на Python:

import asyncio

async def test():
    asyncio.print_call_graph()

async def main():
    async with asyncio.TaskGroup() as g:
        g.create_task(test(), name='test')

asyncio.run(main())

выведет:

* Task(name='test', id=0x1039f0fe0)
+ Call stack:
|   File 't2.py', line 4, in async test()
+ Awaited by:
   * Task(name='Task-1', id=0x103a5e060)
      + Call stack:
      |   File 'taskgroups.py', line 107, in async TaskGroup.__aexit__()
      |   File 't2.py', line 7, in async main()
asyncio.format_call_graph(future=None, /, *, depth=1, limit=None)

Работает как print_call_graph(), но возвращает строку. Если future равен None и текущей задачи нет, функция возвращает пустую строку.

asyncio.capture_call_graph(future=None, /, *, depth=1, limit=None)

Собрать граф асинхронных вызовов для текущей задачи или переданного Task либо Future.

Функция принимает необязательный аргумент future. Если он не передан, используется текущая работающая задача. Если текущей задачи нет, функция возвращает None.

Если функция вызвана для текущей задачи, необязательный аргумент только для ключевого слова depth позволяет пропустить указанное количество фреймов в начале стека.

Возвращает объект класса данных FutureCallGraph:

  • FutureCallGraph(future, call_stack, awaited_by)

    Здесь future — это ссылка на Future или Task (либо их подклассы).

    call_stack — это кортеж объектов FrameCallGraphEntry.

    awaited_by — это кортеж объектов FutureCallGraph.

  • FrameCallGraphEntry(frame)

    Здесь frame — это объект фрейма обычной функции Python в стеке вызовов.

Низкоуровневые вспомогательные функции

Для интроспекции графа асинхронных вызовов asyncio требуется содействие со стороны структур управления потоком, таких как shield() или TaskGroup. Каждый раз, когда задействуется промежуточный объект Future с низкоуровневыми API, например Future.add_done_callback(), следует использовать две приведённые ниже функции, чтобы сообщить asyncio, как именно такие промежуточные объекты Future связаны с задачами, которые они оборачивают или контролируют.

asyncio.future_add_to_awaited_by(future, waiter, /)

Зафиксировать, что future ожидается объектом waiter.

И future, и waiter должны быть экземплярами Future или Task либо их подклассами, иначе вызов не даст результата.

После вызова future_add_to_awaited_by() необходимо в дальнейшем вызвать функцию future_discard_from_awaited_by() с теми же аргументами.

asyncio.future_discard_from_awaited_by(future, waiter, /)

Зафиксировать, что future больше не ожидается объектом waiter.

И future, и waiter должны быть экземплярами Future или Task либо их подклассами, иначе вызов не даст результата.

© 2001 Python Software Foundation
Licensed under the PSF License.
https://docs.python.org/3.14/library/asyncio-graph.html

Spec-Zone.ru

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