如何在存在 generators/coroutines 的情况下检查程序状态?

How to inspect program state in the presence of generators/coroutines?

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

在生成器、基于生成器的协程和基于async def的协程的存在下,我认为调用堆栈是不够的。在脑海中形象化程序状态的好方法是什么?如何在 运行 时间内检查它?

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

编辑:我找到了一个相关的 question on SO which pointed me to this excellent article 解释了我在这个问题中提出的所有问题。

您只需要在所有 "traditional" 帧中找出生成器和协程的所有实例 -(在所有帧的所有对象中递归搜索它们,或者您可以尝试使用垃圾收集器(gc) 模块以获取对所有这些实例的引用)

生成器和协程分别具有 gi_frame 和 cr_frame 属性。