【发布时间】:2018-02-28 13:22:31
【问题描述】:
我想知道 Python 解释器在我的生产环境中的作用。
前段时间,我编写了一个名为live-trace 的简单工具,它运行一个守护线程,每N 毫秒收集一次堆栈跟踪。
但是解释器本身的信号处理有一个缺点:
尽管就 Python 用户而言,Python 信号处理程序是异步调用的,但它们只能出现在 Python 解释器的“原子”指令之间。这意味着在纯 C 中实现的长时间计算期间到达的信号(例如对大量文本的正则表达式匹配)可能会延迟任意时间。
来源:https://docs.python.org/2/library/signal.html
即使解释器在某些 C 代码中停留了几秒钟,我如何才能绕过上述约束并获得堆栈跟踪?
【问题讨论】:
-
@Shark 的“修复间隙”技巧只是一个技巧。想象一下 Python 解释器在方法 foo() 中是 3 秒(在 C 代码中,持有 GIL)。然后在 foo() bar() 被执行之后。如果现在执行计时器,则该技巧确实会在日志中输入 N 次 bar()。诀窍是“猜测”,而不是“知道”。
标签: python profiling usage-statistics