Python 如何在有生成器/协同程序的情况下检查程序状态?

Python 如何在有生成器/协同程序的情况下检查程序状态?,python,python-3.x,python-asyncio,coroutine,python-internals,Python,Python 3.x,Python Asyncio,Coroutine,Python Internals,对于普通函数调用,程序状态主要由一个简单的调用堆栈描述。它作为未捕获异常后的回溯打印出来,可以使用inspect.stack检查,并且可以在断点后在调试器中显示 在存在生成器、基于生成器的coutroutines和基于异步def的协同例程的情况下,我认为调用堆栈是不够的。在精神上想象程序状态的好方法是什么?如何在运行时检查它 有函数inspect.getgeneratorstate和inspect.getcoroutinestate,但它们只提供有关是否创建、运行、挂起或关闭生成器/协同程序的信

对于普通函数调用,程序状态主要由一个简单的调用堆栈描述。它作为未捕获异常后的回溯打印出来,可以使用
inspect.stack
检查,并且可以在断点后在调试器中显示

在存在生成器、基于生成器的coutroutines和基于
异步def
的协同例程的情况下,我认为调用堆栈是不够的。在精神上想象程序状态的好方法是什么?如何在运行时检查它

有函数
inspect.getgeneratorstate
inspect.getcoroutinestate
,但它们只提供有关是否创建、运行、挂起或关闭生成器/协同程序的信息。在状态为运行的情况下,我希望能够检查生成器或协同程序当前正在执行的实际行号以及对应于它可能调用的其他函数的堆栈帧。在它被挂起的情况下,我想检查它向其发送数据或向其提交数据的其他生成器/协同路由


编辑:我找到了一个相关的例子,它向我指出了这一点,解释了我在这个问题中提出的所有问题。

您只需在所有“传统”帧中查找生成器和协例程的所有实例—(要么在所有帧中的所有对象中递归搜索它们,要么尝试使用垃圾收集器(gc)模块以获取对所有这些实例的引用)


生成器和协同例程分别具有gi_帧和cr_帧属性。

是否尝试在断点上显示堆栈,或在基于
异步定义的协同例程中的异常处理程序中调用
回溯。print_stack()
。我在堆栈中看到的是堆栈底部的事件循环、中间的事件处理程序代码和堆栈顶部的实际异步代码。我完全看不到其他合作项目。似乎应该有另一个堆栈或其他东西,但我甚至无法在脑海中清晰地描绘。显然,
.gieldfrom
.cr\u正在等待
帮助导航生成器/协同程序的层次结构。