asyncio-graph.md
1> **Источник:** https://python-all.ru/3.14/library/asyncio-graph.html2>3> «Документация Python на русском» – неофициальный перевод официальной документации Python: версии от 2.6 до 3.16, полнотекстовый поиск, английский оригинал рядом с переводом. Эта Markdown-версия страницы предназначена для работы с LLM: вставьте её в ChatGPT, Claude или Cursor.45---67# Интроспекция графа вызовов89**Исходный код:** [Lib/asyncio/graph.py](https://python-all.ru/src/3.14/Lib/asyncio/graph.py)1011---1213asyncio предоставляет мощные утилиты для интроспекции графа вызовов во время выполнения, чтобы отследить весь граф вызовов работающей *корутины* или *задачи*, или приостановленного *future*. Эти утилиты и лежащая в основе механика могут использоваться как внутри программы на Python, так и внешними профилировщиками и отладчиками.1415Добавлено в версии 3.14.1617#### `asyncio.print_call_graph(future=None, /, *, file=None, depth=1, limit=None)`1819Выводит асинхронный граф вызовов для текущей задачи или переданного [`Task`](https://python-all.ru/3.14/library/asyncio-task.html#asyncio.Task) или [`Future`](https://python-all.ru/3.14/library/asyncio-future.html#asyncio.Future).2021Эта функция выводит записи, начиная с верхнего фрейма и двигаясь вниз к точке вызова.2223Функция принимает необязательный аргумент *future*. Если он не передан, будет использоваться текущая выполняемая задача.2425Если функция вызывается для *текущей задачи*, необязательный именованный аргумент *depth* может использоваться для пропуска указанного количества фреймов с вершины стека.2627Если указан необязательный именованный аргумент *limit*, каждый стек вызовов в результирующем графе обрезается так, чтобы включать не более `abs(limit)` записей. Если *limit* положителен, остаются записи, ближайшие к точке вызова. Если *limit* отрицателен, остаются самые верхние записи. Если *limit* опущен или равен `None`, присутствуют все записи. Если *limit* равен `0`, стек вызовов вообще не выводится, выводится только информация «awaited by».2829Если *file* опущен или равен `None`, функция будет выводить в [`sys.stdout`](https://python-all.ru/3.14/library/sys.html#sys.stdout).3031**Пример:**3233Следующий код Python:3435```python36import asyncio3738async def test():39 asyncio.print_call_graph()4041async def main():42 async with asyncio.TaskGroup() as g:43 g.create_task(test(), name='test')4445asyncio.run(main())46```4748выведет:4950```python51* Task(name='test', id=0x1039f0fe0)52+ Call stack:53| File 't2.py', line 4, in async test()54+ Awaited by:55 * Task(name='Task-1', id=0x103a5e060)56 + Call stack:57 | File 'taskgroups.py', line 107, in async TaskGroup.__aexit__()58 | File 't2.py', line 7, in async main()59```6061#### `asyncio.format_call_graph(future=None, /, *, depth=1, limit=None)`6263Как [`print_call_graph()`](https://python-all.ru/3.14/library/asyncio-graph.html#asyncio.print_call_graph), но возвращает строку. Если *future* равен `None` и нет текущей задачи, функция возвращает пустую строку.6465#### `asyncio.capture_call_graph(future=None, /, *, depth=1, limit=None)`6667Захватывает асинхронный граф вызовов для текущей задачи или переданного [`Task`](https://python-all.ru/3.14/library/asyncio-task.html#asyncio.Task) или [`Future`](https://python-all.ru/3.14/library/asyncio-future.html#asyncio.Future).6869Функция принимает необязательный аргумент *future*. Если он не передан, используется текущая выполняемая задача. Если нет текущей задачи, функция возвращает `None`.7071Если функция вызывается для *текущей задачи*, необязательный именованный аргумент *depth* может использоваться для пропуска указанного количества фреймов с вершины стека.7273Возвращает объект класса данных `FutureCallGraph`:7475- `FutureCallGraph(future, call_stack, awaited_by)`7677 > Где *future* – это ссылка на [`Future`](https://python-all.ru/3.14/library/asyncio-future.html#asyncio.Future) или [`Task`](https://python-all.ru/3.14/library/asyncio-task.html#asyncio.Task) (или их подклассы).78 >79 > `call_stack` – это кортеж объектов `FrameCallGraphEntry`.80 >81 > `awaited_by` – это кортеж объектов `FutureCallGraph`.82- `FrameCallGraphEntry(frame)`8384 > Где *frame* – это объект фрейма обычной функции Python в стеке вызовов.8586## Низкоуровневые вспомогательные функции8788Для интроспекции асинхронного графа вызовов asyncio требует содействия от структур управления потоком, таких как [`shield()`](https://python-all.ru/3.14/library/asyncio-task.html#asyncio.shield) или [`TaskGroup`](https://python-all.ru/3.14/library/asyncio-task.html#asyncio.TaskGroup). Всякий раз, когда задействован промежуточный объект [`Future`](https://python-all.ru/3.14/library/asyncio-future.html#asyncio.Future) с низкоуровневыми API, такими как [`Future.add_done_callback()`](https://python-all.ru/3.14/library/asyncio-future.html#asyncio.Future.add_done_callback), следует использовать следующие две функции, чтобы сообщить asyncio о том, как именно такие промежуточные future-объекты связаны с задачами, которые они оборачивают или контролируют.8990#### `asyncio.future_add_to_awaited_by(future, waiter, /)`9192Записывает, что *future* ожидается объектом *waiter*.9394И *future*, и *waiter* должны быть экземплярами [`Future`](https://python-all.ru/3.14/library/asyncio-future.html#asyncio.Future) или [`Task`](https://python-all.ru/3.14/library/asyncio-task.html#asyncio.Task) или их подклассов, иначе вызов не будет иметь эффекта.9596Вызов `future_add_to_awaited_by()` должен сопровождаться последующим вызовом функции [`future_discard_from_awaited_by()`](https://python-all.ru/3.14/library/asyncio-graph.html#asyncio.future_discard_from_awaited_by) с теми же аргументами.9798#### `asyncio.future_discard_from_awaited_by(future, waiter, /)`99100Регистрирует, что *future* больше не ожидается со стороны *waiter*.101102Оба *future* и *waiter* должны быть экземплярами [`Future`](https://python-all.ru/3.14/library/asyncio-future.html#asyncio.Future) или [`Task`](https://python-all.ru/3.14/library/asyncio-task.html#asyncio.Task) или их подклассов, иначе вызов не будет иметь эффекта.103