【问题标题】:How to inspect program state in the presence of generators/coroutines?如何在存在生成器/协程的情况下检查程序状态?
【发布时间】:2017-02-09 14:53:17
【问题描述】:

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

在存在生成器、基于生成器的协同程序和基于async def 的协同程序的情况下,我认为调用堆栈是不够的。什么是心理可视化程序状态的好方法?如何在运行时检查它?

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

编辑:我找到了一个相关的question on SO,它把我指向了这个excellent article,它解释了我在这个问题中提出的所有问题。

【问题讨论】:

  • 您是否尝试在断点处显示堆栈或在基于 async def 的协程内的异常处理程序中调用 traceback.print_stack()
  • @AndrewSvetlov 是的。我在堆栈中看到的只是堆栈底部的事件循环、中间的事件处理程序代码以及堆栈顶部的实际异步协程代码。我对其他协程一无所知。好像应该有另一个堆栈什么的,但我什至无法在脑海中做出清晰的画面。

标签: python python-3.x python-asyncio coroutine python-internals


【解决方案1】:

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

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

【讨论】:

  • 显然,.gi_yieldfrom.cr_await 帮助导航生成器/协程的层次结构。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-12-23
  • 1970-01-01
  • 2014-08-24
  • 1970-01-01
  • 2014-08-12
  • 1970-01-01
相关资源
最近更新 更多