使用普通函数调用时,程序状态主要由简单的调用堆栈描述。它在未捕获的异常后作为回溯打印出来,可以使用inspect.stack
进行检查,并且可以在断点后显示在调试器中。
在存在生成器,基于生成器的couroutines和基于async def
的协同程序的情况下,我不认为调用堆栈就足够了。什么是精神可视化程序状态的好方法?如何在运行时检查它?
有函数inspect.getgeneratorstate
和inspect.getcoroutinestate
,但它们仅提供有关是否创建,运行,暂停或关闭生成器/协同程序的信息。在状态为RUNNING
的情况下,我希望能够检查生成器或协同程序当前正在执行的实际行号以及与它可能调用的其他函数相对应的堆栈帧。在它的SUSPENDED
的情况下,我想检查它发送数据或产生的其他生成器/协同程序。
修改:我找到了一个相关的question on SO,它向我指出了excellent article,它解释了我在这个问题中提出的所有问题。
答案 0 :(得分:2)
你必须找到发电机和共同例程的所有实例,在所有"传统" frames - (在所有帧中的所有对象中递归搜索它们,或者您尝试使用垃圾收集器(gc)模块来获取对所有这些实例的引用)
生成器和协同例程分别具有gi_frame和cr_frame属性。