명령 줄 인트로스펙션 도구¶
소스 코드: Lib/asyncio/tools.py
asyncio 모듈은 python -m asyncio 를 통해 스크립트로 호출할 수 있으며, 이를 통해 다른 실행 중인 파이썬 프로세스를 수정하거나 재시작하지 않고도 태스크 그래프를 검사할 수 있습니다. asyncio.tools 하위 모듈이 이 인터페이스를 구현합니다.
다음 명령은 PID 로 식별되는 프로세스를 조사합니다:
$ python -m asyncio pstree [--retries N] PID
$ python -m asyncio ps [--retries N] PID
이 명령은 대상 프로세스 내에서 코드를 실행하지 않고 상태를 읽어옵니다. 지원되는 플랫폼에서만 사용 가능하며, 다른 프로세스를 조사하는 데 권한이 필요할 수 있습니다. 자세한 내용은 권한 요구 사항 을(를) 참조하십시오.
더 보기
- 호출 그래프 인트로스펙션
현재 프로세스 내의 태스크 또는 퓨처(future)에 대한 비동기 호출 그래프를 조사하는 프로그래밍용 API입니다.
아래의 명령 예제는 검사에 적합한 태스크 계층을 생성하고 프로세스 ID를 출력하는 이 프로그램을 사용합니다.
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
그 다음 다른 터미널에서 출력된 프로세스 ID를 명령에 전달하십시오. 스레드 ID, 태스크 ID, 파일 경로 및 줄 번호는 실행 시점과 소스 레이아웃에 따라 달라질 수 있습니다.
Added in version 3.14.
명령 줄 옵션¶
- pstree PID¶
태스크와 코루틴의 관계를 트리 구조로 표시합니다. 각 태스크는 전체 코루틴 스택과 함께 해당 태스크를 await하는 상위 태스크(있는 경우) 아래에 배치됩니다. 이 하위 명령은 태스크 계층 중 어느 분기에서 차단이 발생했는지, 그리고 코루틴 스택 내의 어느 지점에서 실행이 일시 중지되었는지 빠르게 파악하는 데 유용합니다.
$ 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
await 그래프에 사이클이 포함된 경우,
pstree는 트리를 출력하는 대신 오류를 보고합니다. await 그래프의 사이클은 흔치 않으며 일반적으로 프로그래밍 오류를 의미합니다:$ python -m asyncio pstree 12345 ERROR: await-graph contains cycles - cannot print a tree! cycle: Task-2 → Task-3 → Task-2
- ps PID¶
프로세스 PID 에서 대기 중인 모든 태스크를 평면 테이블로 표시합니다. 각 행은 이벤트 루프 스레드 ID, 태스크 ID 및 이름, 코루틴 스택과 대기 중인 태스크의 스택, 이름, ID(있는 경우)를 보여줍니다.
이 하위 명령은 await 그래프에 사이클이 포함되어 있는지 여부와 상관없이 모든 태스크를 출력합니다.
$ 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
- --retries N¶
대상 프로세스를 검사하려는 시도가 실패할 경우 최대 N 번까지 재시도합니다. 이는 대상 프로세스의 상태를 읽는 동안 프로세스 상태가 변경될 때 유용합니다.
Added in version 3.15.