有没有一种简单的方法来判断等待 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?