Python

호출 그래프 인트로스펙션

소스 코드: Lib/asyncio/graph.py


asyncio는 실행 중인 코루틴 또는 태스크, 또는 일시 정지된 퓨처 의 전체 호출 그래프를 추적할 수 있는 강력한 런타임 호출 그래프 인트로스펙션 유틸리티를 제공합니다. 이러한 유틸리티와 그 기초가 되는 메커니즘은 파이썬 프로그램 내부나 외부 프로파일러 및 디버거에서 사용할 수 있습니다.

Added in version 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 인 경우 모든 항목이 표시됩니다. limit0 인 경우, 호출 스택은 출력되지 않고 “awaited by” 정보만 출력됩니다.

file 이 생략되거나 None 인 경우, 함수는 sys.stdout 에 내용을 인쇄합니다.

예제:

다음 파이썬 코드:

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() 와 유사하지만 문자열을 반환합니다. futureNone 이고 현재 태스크가 없는 경우, 이 함수는 빈 문자열을 반환합니다.

asyncio.capture_call_graph(future=None, /, *, depth=1, limit=None)

현재 태스크 또는 제공된 TaskFuture 에 대한 비동기 호출 그래프를 캡처합니다.

이 함수는 선택적 future 인자를 받습니다. 전달되지 않은 경우, 현재 실행 중인 태스크가 사용됩니다. 현재 태스크가 없는 경우, 이 함수는 None 을 반환합니다.

함수가 현재 태스크*에서 호출되는 경우, 선택적 키워드 전용 *depth 인자를 사용하여 스택 상단에서 지정된 수의 프레임을 건너뛸 수 있습니다.

FutureCallGraph 데이터 클래스 객체를 반환합니다:

  • FutureCallGraph(future, call_stack, awaited_by)

    여기서 futureFuture 또는 Task (및 그 하위 클래스)를 가리키는 참조입니다.

    call_stack``은 ``FrameCallGraphEntry 객체들의 튜플입니다.

    awaited_by``는 ``FutureCallGraph 객체들의 튜플입니다.

  • FrameCallGraphEntry(frame)

    여기서 frame 은 호출 스택에 있는 일반 파이썬 함수의 프레임 객체입니다.

저수준 유틸리티 함수

비동기 호출 그래프를 조사(introspection)하기 위해 asyncio는 shield() 또는 TaskGroup 과 같은 제어 흐름 구조의 협력이 필요합니다. Future.add_done_callback() 와 같은 저수준 API를 포함하는 중간 Future 객체가 관여할 때마다, 이러한 중간 퓨처 객체가 그것이 감싸거나 제어하는 태스크들과 정확히 어떻게 연결되어 있는지 asyncio에 알리기 위해 다음 두 함수를 사용해야 합니다.

asyncio.future_add_to_awaited_by(future, waiter, /)

futurewaiter 에 의해 대기(awaited)되고 있음을 기록합니다.

future*와 *waiter 모두 Future 또는 Task 또는 그 하위 클래스의 인스턴스여야 하며, 그렇지 않으면 호출이 아무런 효과를 주지 않습니다.

future_add_to_awaited_by() 호출 후에는 동일한 인자를 가진 future_discard_from_awaited_by() 함수를 호출해야 합니다.

asyncio.future_discard_from_awaited_by(future, waiter, /)

future 가 더 이상 waiter 에 의해 대기되지 않음을 기록합니다.

future*와 *waiter 모두 Future 또는 Task 또는 그 하위 클래스의 인스턴스여야 하며, 그렇지 않으면 호출이 아무런 효과를 주지 않습니다.