【发布时间】:2017-02-09 14:53:17
【问题描述】:
对于普通的函数调用,程序状态主要由一个简单的调用堆栈来描述。它在未捕获的异常之后作为回溯打印出来,可以使用inspect.stack 进行检查,并且可以在断点后显示在调试器中。
在存在生成器、基于生成器的协同程序和基于async def 的协同程序的情况下,我认为调用堆栈是不够的。什么是心理可视化程序状态的好方法?如何在运行时检查它?
有 inspect.getgeneratorstate 和 inspect.getcoroutinestate 函数,但它们只提供有关生成器/协程是否创建、运行、暂停或关闭的信息。在状态为RUNNING 的情况下,我希望能够检查生成器或协程当前正在执行的实际行号以及与它可能调用的其他函数相对应的堆栈帧。如果是SUSPENDED,我想检查它发送数据或屈服的其他生成器/协程。
编辑:我找到了一个相关的question on SO,它把我指向了这个excellent article,它解释了我在这个问题中提出的所有问题。
【问题讨论】:
-
您是否尝试在断点处显示堆栈或在基于
async def的协程内的异常处理程序中调用traceback.print_stack()? -
@AndrewSvetlov 是的。我在堆栈中看到的只是堆栈底部的事件循环、中间的事件处理程序代码以及堆栈顶部的实际异步协程代码。我对其他协程一无所知。好像应该有另一个堆栈什么的,但我什至无法在脑海中做出清晰的画面。
标签: python python-3.x python-asyncio coroutine python-internals