Интроспекция графа вызовов
Исходный код: 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()с теми же аргументами.
© 2001 Python Software Foundation
Licensed under the PSF License.
https://docs.python.org/3.14/library/asyncio-graph.html