Spec-Zone.ru › Python 3.14

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

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

Модуль asyncio можно запустить как скрипт с помощью python -m asyncio, чтобы просмотреть граф задач другого работающего процесса Python, не изменяя его и не перезапуская. Подмодуль asyncio.tools реализует этот интерфейс.

Следующие команды просматривают процесс, указанный в PID:

$ python -m asyncio pstree PID
$ python -m asyncio ps PID

Команды считывают состояние целевого процесса, не выполняя в нём никакого кода. Они доступны только на поддерживаемых платформах; для просмотра другого процесса может потребоваться разрешение. Подробности см. в разделе требования к разрешениям.

См. также

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

Программные API для просмотра графа асинхронных вызовов задачи или future в текущем процессе.

В приведённых ниже примерах команд используется эта программа: она создаёт иерархию задач, подходящую для просмотра, и выводит идентификатор своего процесса:

example.py
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

Spec-Zone.ru

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