随着行业趋向于“Web 规模”应用程序架构(尽管我讨厌流行语),我知道 Python 因GIL如何处理并发并成为瓶颈而受到了很多批评。我理解表面上的问题,但还不足以了解其他过程语言如何处理引擎盖下的线程。Java有类似的问题吗?C#?红宝石?如果不是,为什么 Python 没有采用相同的策略?
问问题
278 次
1 回答
7
GIL 的存在是因为它(主要)是 CPython 实现引用计数所需要的——它是垃圾收集的方法。所以让我们明确一点,Python没有 GIL,参考实现有,而且它只是一个实现细节。
GIL 的存在是因为它使实现变得简单和快速,而且在大多数情况下,它根本不重要。线程主要被设计为允许在处理的同时访问慢速资源,这完全不受 GIL 的阻碍。
GIL 可能成为问题的唯一原因是人们想要进行大量并行计算。在这种情况下,可以在 C 中制作一个扩展模块,或者使用该multiprocessing
模块来回避 GIL。
所有这一切意味着 GIL 在 99.9% 的情况下确实不是问题,而且当它出现时,它很容易解决。如果您发现它确实阻碍了您,那么您可能想要尝试 Jython,它在 JVM 之上实现并使用不需要 GIL 的不同垃圾收集方法。
与往常一样,过早的优化是一个坏主意——如果你开发了一些东西并发现自己受到 GIL 的伤害,那么有一些方法可以轻松解决它。也就是说,您极不可能在现实世界中发现这是一个问题。这是围绕 Python 最夸张的事情之一(可能仅次于整个缩进)。
于 2012-12-20T01:23:22.190 回答