1

일반적인 함수 호출에서는 프로그램 상태가 간단한 호출 스택에 의해 대부분 설명됩니다. 캐치되지 않은 예외가 발생한 후에는 추적 코드로 인쇄되고 inspect.stack으로 검사 할 수 있으며 중단 점 다음에 디버거에 표시 될 수 있습니다.발전기/동시 처리 장치가있는 상태에서 프로그램 상태를 검사하는 방법은 무엇입니까?

발전기, 생성기 기반 쿠로루, 및 async def 기반 코 루틴이있는 경우에는 호출 스택이 충분하지 않다고 생각합니다. 정신적으로 프로그램 상태를 시각화하는 좋은 방법은 무엇입니까? 실행 시간에 어떻게 검사합니까?

함수는 inspect.getgeneratorstateinspect.getcoroutinestate이지만 생성자/동시 루틴이 생성, 실행, 일시 중단 또는 폐쇄되었는지 여부에 대한 정보 만 제공합니다. 상태가 RUNNING 인 경우 생성자 또는 동시 루틴이 현재 실행중인 실제 행 번호와 호출했을 수있는 다른 함수에 해당하는 스택 프레임을 검사 할 수 있기를 원합니다. 경우 SUSPENDED, 나는 다른 발전기/coroutines 그것이 데이터를 보내거나 굴복을 검사하고 싶습니다.

편집 :이 질문에 대해 질문하는 모든 것을 설명하는 excellent article에 대해 설명하는 관련 question on SO을 발견했습니다.

+0

중단 점에 스택을 표시하거나 예외 처리기에서'async def' 기반 코 루틴 내부에'traceback.print_stack()'을 호출하려고 했습니까? –

+0

@AndrewSvetlov 예. 스택에서 볼 수있는 것은 스택 하단의 이벤트 루프, 중간의 이벤트 처리기 코드 및 스택 상단의 실제 비동기 코 루틴 코드입니다. 다른 코 루틴에 대해서는 전혀 아무것도 보지 못합니다. 다른 스택이나 뭔가가 있어야하는 것처럼 보이지만 내 마음 속에도 선명한 그림을 만들 수는 없습니다. – max

답변

1

"모든"프레임에서 모든 객체의 재귀 적으로 검색하거나 가비지 컬렉터 (gc)를 사용하려고하면 "모든"전통적인 프레임에서 모든 생성자와 루틴을 찾아야합니다. 모듈을 사용하여이 모든 인스턴스에 대한 참조를 가져옵니다.

생성자와 루틴에는 각각 gi_frame 및 cr_frame 속성이 있습니다.

+1

그리고 분명히'.gi_yieldfrom'과'.cr_await'는 생성자/동시 루틴의 계층을 탐색하는데 도움이됩니다. – max

관련 문제