有没有一种简单的方法可以告诉我们等待Python GIL花了多少时间?

有没有一种简单的方法可以告诉我们等待Python GIL花了多少时间?,python,multithreading,Python,Multithreading,我有一个长期运行的Python服务,我想知道任何可运行线程(即,没有因为其他原因被阻塞的线程)等待GIL的累计挂钟时间。有没有一个简单的方法可以做到这一点?例如,也许我可以定期将一些计数器转储到它的日志文件中 我的潜在动机是排除GIL作为这些长期运行的进程的神秘响应延迟的来源。没有特别的理由怀疑GIL(除了它会符合症状之外),但是其他形式的日志记录还没有发现任何东西,因此,如果很容易的话,最好有这些信息。我认为没有简单的方法。这可能是一种笨拙的方法,包括重建Python来遍历PyThreadSt

我有一个长期运行的Python服务,我想知道任何可运行线程(即,没有因为其他原因被阻塞的线程)等待GIL的累计挂钟时间。有没有一个简单的方法可以做到这一点?例如,也许我可以定期将一些计数器转储到它的日志文件中


我的潜在动机是排除GIL作为这些长期运行的进程的神秘响应延迟的来源。没有特别的理由怀疑GIL(除了它会符合症状之外),但是其他形式的日志记录还没有发现任何东西,因此,如果很容易的话,最好有这些信息。

我认为没有简单的方法。这可能是一种笨拙的方法,包括重建Python来遍历PyThreadState列表,并在每次获取锁时计算线程数,但我怀疑这是否值得


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

您现在可以使用配置文件分析GIL的使用情况


请参阅以解决另一个问题。

gil_加载项目会告诉您gil的保存频率(即,至少有一个线程是可运行的)。这个问题询问GIL被等待的频率(即,至少有两个线程是可运行的)。gil_load是如何实现的?从版本0.4开始,gil_load现在可以告诉您每个线程等待gil的时间比例。