有没有一种简单的方法来判断等待 Python GIL 花费了多少时间?

Posted

技术标签:

【中文标题】有没有一种简单的方法来判断等待 Python GIL 花费了多少时间?【英文标题】:Is there an easy way to tell how much time is spent waiting for the Python GIL? 【发布时间】:2009-04-27 21:42:12 【问题描述】:

我有一个长期运行的 Python 服务,我想知道等待 GIL 的任何可运行线程(即未因其他原因被阻塞的线程)花费了多少累积挂钟时间。是否有捷径可寻?例如,也许我可以定期将一些计数器转储到其日志文件中。

我的基本动机是排除 GIL 作为这些长期运行过程中神秘响应延迟的来源。没有特别的理由怀疑 GIL(除了它符合症状之外),但其他形式的日志记录还没有出现任何情况,所以,如果容易,它会是很高兴有这些信息。

【问题讨论】:

【参考方案1】:

我认为没有简单的方法。可能有一种尴尬的方式,涉及重新构建 Python 以遍历 PyThreadState 列表并在每次获取锁时计算线程数,但我怀疑这是否值得!

我知道这是一个推测性的问题,但如果您稍微担心线程会导致延迟,那么转向多处理模型而不是多线程模型可能是明智的。由于 Python 中的流程更安全且更具可扩展性,因此如果可行,它们几乎总是最佳选择。

【讨论】:

【参考方案2】:

您现在可以使用 gil_load 分析 GIL 使用情况。

其他问题请参见my answer。

【讨论】:

gil_load 项目告诉您 GIL 的持有频率(即,至少一个线程是可运行的)。该问题询问 GIL 被等待的频率(即,至少两个线程是可运行的)。您如何使用 gil_load 实现这一目标? 从 0.4 版开始,gil_load 现在可以根据每个线程告诉您线程等待 GIL 的时间比例。

以上是关于有没有一种简单的方法来判断等待 Python GIL 花费了多少时间?的主要内容,如果未能解决你的问题,请参考以下文章

有没有一种简单的方法来腌制一个 python 函数(或者序列化它的代码)?

有没有一种更简单的方法来为给定 if 条件的变量分配值 - Python?

有没有一种简单的方法来检查一个对象是不是在 python 中是 JSON 可序列化的?

python判断字符串是否包含子字符串

14三种等待方式及元素判断

无法在 Python3 中导入 gi.repository