如何检查程序状态是否存在发生器/协程?
对于正常的函数调用,程序状态主要由一个简单的调用堆栈来描述。 它在未捕获的异常之后作为回溯被打印出来,它可以用inspect.stack
检查,并且可以在断点后显示在调试器中。
在发生器,基于生成器的例程和async def
基于async def
的协程的情况下,我认为调用堆栈不够。 什么是精神上可视化程序状态的好方法? 我如何在运行时检查它?
有函数inspect.getgeneratorstate
和inspect.getcoroutinestate
,但它们仅提供有关生成器/协程是创建,运行,暂停还是关闭的信息。 在状态为RUNNING
的情况下,我希望能够检查生成器或协程当前正在执行的实际行号以及与它可能调用的其他函数相对应的堆栈帧。 在它处于SUSPENDED
的情况下,我想检查其发送数据或将其发送到的其他生成器/协程。
编辑:我发现了一个关于SO的相关问题,它指出了这篇出色的文章,解释了我在这个问题中所提到的一切。
您只需要找出所有“传统”框架中的生成器和协同例程的所有实例(或者在所有框架中的所有对象中递归地搜索它们,或者尝试使用垃圾收集器(gc)模块来获取参考所有这些实例)
生成器和协程分别具有gi_frame和cr_frame属性。
链接地址: http://www.djcxy.com/p/1537.html上一篇: How to inspect program state in the presence of generators/coroutines?
下一篇: Python vs Cpython