sys._current_frames()中的孤立堆栈跟踪

问题描述 投票:2回答:1

这是一个深奥的纯Python问题。

我正在使用sys._current_frames()做一些统计分析。即,我有一个每秒运行一次sys._current_frames()的后台线程,将结果转储到文本文件中,然后稍后我得到了一些Python代码,对从最常见到最少的追溯进行排序。

我见过的一个奇怪现象是这样的回溯:

  File "/opt/foo/bar.py", line 1437, in __iter__
    yield key

[yield是我写的一个生成器。奇怪的是,此回溯中只有一帧。怎么会这样另一个回溯具有很多框架,这些框架可能来自过程的顶层,也可能来自框架的顶层。此单帧堆栈跟踪的含义是什么?

[我有一个理论是,这是生成器的冻结状态,它产生了一个值,并且等待再次调用next。但是我认为我通过一个单独的实验来反驳了这一理论:我制造了一个生成器,确保它被暂停,称为sys._current_frames(),但是我没有看到这种堆栈跟踪。

python generator stack-trace introspection
1个回答
0
投票

您的任务正在其自己的后台线程中运行,因此很容易出现竞争状况。

正如您所怀疑的,您正在看到一个暂停的生成器的堆栈跟踪。当生成器挂起时,其堆栈框架没有父框架。其f_back设置为null。

sys._current_frames()检索当前正在运行的线程的堆栈框架,但是当您查看这些框架时,它们可能不再运行。如果在调用sys._current_frames()的时间与检查帧的时间之间生成器暂停,则外观将是这样。如果它在其他地方恢复,您可能还会在与实际调用sys._current_frames()时完全不同的调用堆栈上看到它。

您的测试未显示生成器框架,因为您在调用sys._current_frames()之前而不是之后挂起了生成器。当时,生成器的堆栈框架不是任何线程的活动框架。

© www.soinside.com 2019 - 2024. All rights reserved.