호출 그래프 인트로스펙션¶
소스 코드: 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인 경우 모든 항목이 표시됩니다. limit 이0인 경우, 호출 스택은 출력되지 않고 “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()와 유사하지만 문자열을 반환합니다. future 가None이고 현재 태스크가 없는 경우, 이 함수는 빈 문자열을 반환합니다.
- asyncio.capture_call_graph(future=None, /, *, depth=1, limit=None)¶
현재 태스크 또는 제공된
Task나Future에 대한 비동기 호출 그래프를 캡처합니다.이 함수는 선택적 future 인자를 받습니다. 전달되지 않은 경우, 현재 실행 중인 태스크가 사용됩니다. 현재 태스크가 없는 경우, 이 함수는
None을 반환합니다.함수가 현재 태스크*에서 호출되는 경우, 선택적 키워드 전용 *depth 인자를 사용하여 스택 상단에서 지정된 수의 프레임을 건너뛸 수 있습니다.
FutureCallGraph데이터 클래스 객체를 반환합니다:FutureCallGraph(future, call_stack, awaited_by)FrameCallGraphEntry(frame)여기서 frame 은 호출 스택에 있는 일반 파이썬 함수의 프레임 객체입니다.
저수준 유틸리티 함수¶
비동기 호출 그래프를 조사(introspection)하기 위해 asyncio는 shield() 또는 TaskGroup 과 같은 제어 흐름 구조의 협력이 필요합니다. Future.add_done_callback() 와 같은 저수준 API를 포함하는 중간 Future 객체가 관여할 때마다, 이러한 중간 퓨처 객체가 그것이 감싸거나 제어하는 태스크들과 정확히 어떻게 연결되어 있는지 asyncio에 알리기 위해 다음 두 함수를 사용해야 합니다.
- asyncio.future_add_to_awaited_by(future, waiter, /)¶
future 가 waiter 에 의해 대기(awaited)되고 있음을 기록합니다.
future*와 *waiter 모두
Future또는Task또는 그 하위 클래스의 인스턴스여야 하며, 그렇지 않으면 호출이 아무런 효과를 주지 않습니다.future_add_to_awaited_by()호출 후에는 동일한 인자를 가진future_discard_from_awaited_by()함수를 호출해야 합니다.