有没有简单的方法来确定等待Python GIL的时间?

7
我有一个长时间运行的Python服务,我想知道任何可运行线程(即没有因其他原因被阻塞的线程)等待GIL的总累计墙钟时间。是否有一种简单的方法来实现这一点?例如,我可以定期将某些计数器转储到其日志文件中。
我的根本动机是排除GIL作为这些长时间运行进程神秘响应延迟的原因。没有特别的理由怀疑GIL(除了符合症状之外),但其他形式的日志记录还没有发现任何东西,所以如果它很容易,那么获得这些信息将是不错的。
3个回答

3

我认为没有简单的方法。可能有一种笨拙的方法,需要重建Python以遍历PyThreadState列表并每次获取锁时计算线程数,但我怀疑这样做是否值得努力!

我知道这是一个推测性的问题,但如果你对线程引起的延迟有丝毫关注,采用多进程模型而不是多线程模型可能是明智的选择。由于在Python中,进程既更安全又更可扩展,所以如果可行的话,它们几乎总是最好的选择。


2

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

请参见我的回答,以了解其他问题的情况。


gil_load项目告诉您全局解释器锁(GIL)被持有的频率(即,至少有一个线程可运行)。问题要求知道GIL正在等待的频率(即,至少有两个线程可运行)。您如何使用gil_load实现这一点? - Mathias Rav
从版本0.4开始,gil_load现在可以告诉您每个线程等待GIL的时间比例。 - Chris Billington

0
我发现pyspy在查找Python在持有GIL时花费多少时间以及在哪里花费时间方面非常有用。您可以运行程序,在htop中查找PID,然后运行以下命令:
py-spy record --gil --pid 2240761

一分钟后,您可以使用Ctrl + C,它将生成一个交互式的SVG文件,显示了在哪个函数占用GIL的时间比例的火焰图(您可以点击放大部分):

pyspy gil flame graph


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接