Python 3.1中的GIL

16

有人知道 Python 3.1 中全局解释器锁与 C++ 多线程集成的命运吗?

7个回答

25

GIL仍然存在于CPython 3.1中;Unladen Swallow项目旨在最终消除它,但离达成目标还有一段路要走,目前正在2.6上工作,并打算最终移植到3.x,以适应2.y版本完成时的当前x。目前,在CPython中使用多个核心的首选方法仍然是使用多进程(而不是线程)(IronPython和Jython也可以,但它们目前不支持Python 3,而且它们也不容易进行C++集成;-)。


谢谢您的回答。 IronPython有望拥有多线程解决方案,因为它与CLR集成。但是我的任务是将Python插入现有的跨平台C++应用程序中。这就是为什么IronPython和多处理都不太合适的原因。 - Dewfy
10
只要从Python进入C++应用程序的所有入口点都使用正确的宏以允许自由线程,你的C++应用程序将不受GIL的影响 - 只有Python自己的执行会被串行化(在进行I/O等操作期间GIL将被取消)。Ironclad,http://www.resolversystems.com/documentation/index.php/Ironclad.html,提供一些(尚不完整的)帮助实现IronPython<->C/C++接口,但“多平台”不是.NET此时的优势;我也不知道是否有类似的Jython辅助工具。 - Alex Martelli

17

Python 3.2的GIL将发生重大变化。请查看Python 3.2的新特性在邮件列表中引发此变化的线程

虽然这些变化并不意味着GIL的终结,但它们预示着潜在的巨大性能提升。

更新

  • 新版3.2的GIL由Antoine Pitrou改进后的性能增益微不足道,而是专注于解决某些特定情况下争用问题
  • David Beazley做出了令人钦佩的努力,实现了一个调度程序,可以显著提高CPU和IO绑定线程混合时的性能,但遗憾的是这个想法被否决了。
  • Unladen Swallow工作曾计划在Python 3.3中合并,但由于该项目缺乏结果,已被撤回。PyPy现在是首选项目,并且目前请求资金支持以添加对Python3k的支持。目前几乎没有PyPy成为默认选项的可能性。

过去15年一直在努力从CPython中移除GIL,但可预见的未来它将继续存在。


@Matt Joiner,我正在密切关注“Unladen Swallow”(http://code.google.com/p/unladen-swallow/)项目。这是我问题的唯一解决方案。 - Dewfy
@Dewfy,我已经查看了unladen-swallow,并且他们公开承认他们的成果并不如他们所希望的那样成功。然而,他们的努力可能会被合并到Python 3.3中,详情请见http://www.python.org/dev/peps/pep-3146/。 - Matt Joiner
1
让我们为Python 3.3成功实现多线程而祈祷。 - Dewfy

9

GIL(全局解释器锁)不会影响不使用Python对象的代码。在NumPy中,我们为计算代码(线性代数调用等)释放GIL,并且底层代码可以自由地使用多线程(实际上,这些通常是不知道Python的第三方库)。


但是我想要的确切内容是 - 同时运行多个插入脚本。即使两个同时执行的 Python 代码块不使用共享资源,这个想法仍然困扰着我。 - Dewfy

4

GIL是个好东西。

只需要在C++应用程序进行多线程工作时释放GIL。Python代码将在其他线程中继续运行,不受影响。只有在需要操作Python对象时才获取GIL。


1

我想GIL(全局解释器锁)永远都会存在。

原因是性能。让所有低级别的访问都线程安全——意味着在每个哈希操作周围放置一个互斥锁等,这是很耗费资源的。请记住,像这样的简单语句

self.foo(self.bar, 3, val)

如果val是全局变量,那么此时可能已经有至少3个哈希表查找,而且如果方法缓存不热(取决于类的继承深度),甚至可能会有更多。

这很昂贵 - 这就是为什么Java放弃了这个想法,并引入了哈希表,它不使用监视器调用来摆脱其“Java速度慢”的商标。


1
Jython和IronPython如何解决同样的问题? - Pavel Minaev
@Pavel,IronPython使用.Net方法-只有明确“声明”的方法是线程安全的,因为它是动态语言(由.Net 3.5提供),所以.py和C#代码之间没有区别。 - Dewfy
@Lothar,你的例子与GIL的实现绑定在一起,这就是为什么我强烈反对“可能已经至少有3个...”。另一种选择,例如,可以是公寓模型-您在公寓中启动Python的某些实例,并根据需要混合代码和C ++。同步是程序员的责任。当2个或更多线程需要协作时,您按需提供这些内容。 - Dewfy
不知道“apartment model”是什么,我猜你只是指分离的内存空间。是的,这就是TCL所做的,但这只是多进程模型的不同实现方式。对我来说,“线程”总是意味着共享内存,因此您必须共享解释器实例和Python运行时。而运行时和解释器有很多需要保护的内部结构。即使您不关心是否允许Python程序崩溃解释器,您也需要GIL或一些同步。 - Lothar

1

这件事没有发生,它被拒绝了。:( - Matt Joiner

1
如果GIL成为了阻碍,只需使用multiprocessing模块。它会生成新的进程,但使用线程模型和(大部分)API。换句话说,您可以以类似线程的方式进行基于进程的并行处理。

这段内容与我的问题无关。你是从Python开发者的角度来谈论的。我关心的是C++开发者的角度。 - Dewfy

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接