随着“Web 规模”应用程序架构的行业趋势(尽管我讨厌流行语),我知道 Python 因 GIL 处理并发性的方式受到了很多批评并成为瓶颈。我理解表面上的问题,但还不够了解其他过程语言如何处理引擎盖下的线程。 Java有没有类似的问题? C#? ruby ?如果不是,为什么 Python 没有采用相同的策略?

最佳答案

GIL 的存在是因为它(主要)是 CPython 的引用计数实现所需要的——它是垃圾收集的方法。所以让我们明确一点,Python 没有 GIL,引用实现有,它只是一个实现细节。

GIL 的存在是因为它使实现变得简单而快速,而且大多数时候,它根本无关紧要。线程主要旨在允许在处理的同时访问慢速资源,这完全不受 GIL 的阻碍。

GIL 可能成为问题的唯一原因是人们想要进行大量并行计算。在这种情况下,可以用 C 语言创建一个扩展模块或使用 multiprocessing 模块来回避 GIL。

所有这一切意味着 GIL 在 99.9% 的情况下真的不是问题,当它出现时,它很容易解决。如果您发现它确实阻碍了您,那么您可能想尝试 Jython,它在 JVM 之上实现并使用不需要 GIL 的不同垃圾收集方法。

与往常一样,过早优化是一个坏主意——如果你开发了一些东西并发现自己受到 GIL 的伤害,那么有很多方法可以解决它而不会带来太多痛苦。也就是说,您极不可能在现实世界中发现这是一个问题。这是围绕 Python 最夸张的事情之一(可能仅次于整个缩进)。

关于python - 其他语言是如何克服 Python 的 GIL 的限制的?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/13963887/

10-16 04:27