Инструменты интроспекции командной строки
Исходный код: Lib/asyncio/tools.py
Модуль asyncio можно запустить как скрипт с помощью python -m
asyncio, чтобы просмотреть граф задач другого работающего процесса Python, не изменяя его и не перезапуская. Подмодуль asyncio.tools реализует этот интерфейс.
Следующие команды просматривают процесс, указанный в PID:
$ python -m asyncio pstree PID $ python -m asyncio ps PID
Команды считывают состояние целевого процесса, не выполняя в нём никакого кода. Они доступны только на поддерживаемых платформах; для просмотра другого процесса может потребоваться разрешение. Подробности см. в разделе требования к разрешениям.
См. также
- Интроспекция графа вызовов
-
Программные API для просмотра графа асинхронных вызовов задачи или future в текущем процессе.
В приведённых ниже примерах команд используется эта программа: она создаёт иерархию задач, подходящую для просмотра, и выводит идентификатор своего процесса:
import asyncio
import os
async def play(track):
await asyncio.sleep(3600)
print(f"🎵 Finished: {track}")
async def album(name, tracks):
async with asyncio.TaskGroup() as tg:
for track in tracks:
tg.create_task(play(track), name=track)
async def main():
print(f"PID: {os.getpid()}")
async with asyncio.TaskGroup() as tg:
tg.create_task(
album("Sundowning", ["TNDNBTG", "Levitate"]),
name="Sundowning",
)
tg.create_task(
album("TMBTE", ["DYWTYLM", "Aqua Regia"]),
name="TMBTE",
)
asyncio.run(main())
Запустите программу в одном терминале и оставьте её работающей:
$ python example.py PID: 12345
Затем передайте выведенный идентификатор процесса командам из другого терминала. Идентификаторы потоков и задач, пути к файлам и номера строк могут различаться в зависимости от запуска и расположения исходного кода.
Добавлено в версии 3.14.
Параметры командной строки
-
pstree PID -
Отобразить связи между задачами и сопрограммами в виде дерева. Для каждой задачи отображается полный стек её сопрограммы; задача помещается под задачей (если такая есть), которая её ожидает. Эта подкоманда позволяет быстро определить, какая ветвь иерархии задач заблокирована и на каком месте в стеке сопрограммы остановилось выполнение:
$ python -m asyncio pstree 12345 └── (T) Task-1 └── main example.py:12 └── TaskGroup.__aexit__ Lib/asyncio/taskgroups.py:75 └── TaskGroup._aexit Lib/asyncio/taskgroups.py:124 ├── (T) Sundowning │ └── album example.py:7 │ └── TaskGroup.__aexit__ Lib/asyncio/taskgroups.py:75 │ └── TaskGroup._aexit Lib/asyncio/taskgroups.py:124 │ ├── (T) TNDNBTG │ │ └── play example.py:4 │ │ └── sleep Lib/asyncio/tasks.py:702 │ └── (T) Levitate │ └── play example.py:4 │ └── sleep Lib/asyncio/tasks.py:702 └── (T) TMBTE └── album example.py:7 └── TaskGroup.__aexit__ Lib/asyncio/taskgroups.py:75 └── TaskGroup._aexit Lib/asyncio/taskgroups.py:124 ├── (T) DYWTYLM │ └── play example.py:4 │ └── sleep Lib/asyncio/tasks.py:702 └── (T) Aqua Regia └── play example.py:4 └── sleep Lib/asyncio/tasks.py:702Если граф ожидания содержит цикл,
pstreeсообщает об ошибке вместо вывода дерева. Цикл в графе ожидания — необычное явление, которое обычно указывает на ошибку в программе:$ python -m asyncio pstree 12345 ERROR: await-graph contains cycles - cannot print a tree! cycle: Task-2 → Task-3 → Task-2
-
ps PID -
Отобразить плоскую таблицу всех ожидающих задач в процессе PID. В каждой строке указаны идентификатор потока цикла событий, идентификатор и имя задачи, стек сопрограммы, а также стек, имя и идентификатор ожидающей задачи, если она есть.
Эта подкоманда выводит все задачи независимо от того, содержит ли граф ожидания циклы:
$ python -m asyncio ps 12345 tid task id task name coroutine stack awaiter chain awaiter name awaiter id ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ 18445801 0x10a456060 Task-1 TaskGroup._aexit -> TaskGroup.__aexit__ -> main 0x0 18445801 0x10a439f60 Sundowning TaskGroup._aexit -> TaskGroup.__aexit__ -> album TaskGroup._aexit -> TaskGroup.__aexit__ -> main Task-1 0x10a456060 18445801 0x10a439d70 TMBTE TaskGroup._aexit -> TaskGroup.__aexit__ -> album TaskGroup._aexit -> TaskGroup.__aexit__ -> main Task-1 0x10a456060 18445801 0x10a2a3a80 TNDNBTG sleep -> play TaskGroup._aexit -> TaskGroup.__aexit__ -> album Sundowning 0x10a439f60 18445801 0x10a2a38a0 Levitate sleep -> play TaskGroup._aexit -> TaskGroup.__aexit__ -> album Sundowning 0x10a439f60 18445801 0x10a2d7150 DYWTYLM sleep -> play TaskGroup._aexit -> TaskGroup.__aexit__ -> album TMBTE 0x10a439d70 18445801 0x10a6bdaa0 Aqua Regia sleep -> play TaskGroup._aexit -> TaskGroup.__aexit__ -> album TMBTE 0x10a439d70
© 2001 Python Software Foundation
Licensed under the PSF License.
https://docs.python.org/3.14/library/asyncio-tools.html