【问题标题】:How have other languages overcame the limitations of Python's GIL?其他语言是如何克服 Python GIL 的限制的?
【发布时间】:2012-12-20 01:19:50
【问题描述】:

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

【问题讨论】:

  • Nit:GIL 是 CPython 的产物; Python 语言中没有任何东西需要 GIL。
  • 事实上,Jython 和 IIRC IronPython 没有 GIL,它们的多线程能力与其底层 JVM/CLR 一样。

标签: python multithreading concurrency


【解决方案1】:

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

GIL 的存在是因为它使实现变得简单而快速,而且在大多数情况下,它根本不重要。线程主要是为了在处理过程中允许访问慢速资源,这完全不受 GIL 的阻碍。

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

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

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

【讨论】:

  • 这不仅仅是引用计数。可以为引用计数添加细粒度(每个对象)锁(这非常慢,至少没有大量的进一步更改),而且不仅仅是引用计数目前还不是线程安全的,因为它依赖于 GIL 进行同步。
  • @delnan 为更清晰而编辑。
  • 我仍然不会说主要(GC这又是什么?它不是“停止世界”吗?)。如果 GIL 消失,可能有一半的内置对象方法需要锁。除此之外,你没有回答一半的问题(其他语言是做什么的)。
  • 问题的其他语言做什么部分并不真正适合 SO,因为它非常适合购物清单。我回答了问题中更具建设性的部分。
  • 我相信答案不一定是购物清单,基本上只有另一种方法(锁定少于整个解释器)。我自己会写一个答案,但是您已经很好地说明了 CPython 的动机部分,而且我不是其他语言实现方面的专家。
猜你喜欢
  • 2010-10-26
  • 1970-01-01
  • 2020-08-15
  • 2011-03-24
  • 1970-01-01
  • 2010-12-20
  • 2011-03-16
  • 1970-01-01
  • 2012-02-21
相关资源
最近更新 更多