有没有人知道命运的全球解释锁在Python3.1对C++多线程的整合

有帮助吗?

解决方案

GIL仍然存在在CPython的3.1;在空载燕子项目目标(其中包括许多其他的性能提升),最终将其删除,但它仍然从它的目标的方式,并正在2.6先用最终移植到3.x的任何x是由2.Y版本被认为是完成时的当前意图。现在,多处理(而不是线程)仍然是首选的方式在CPython的(IronPython和Jython的都很好过,但他们不支持的Python 3目前,他们也不让C ++集成那么容易或者使用多个内核; - )。

其他提示

显着的变化将会发生在吉尔Python3.2.看看 有什么新Python3.2, , 线启动它的邮件列表.

虽然更改不意味着结束GIL,他们预示着潜在的巨大性能的收益。

Update0

  • 一般的性能增益与新GIL在3.2由安托万Pitrou是可以忽略不计,而是重点 提高竞争问题 出现在某些角落的情况。
  • 一个 令人钦佩的努力 由大卫*比兹利是为了实现一个计划程序,以大幅改善性能的时候,CPU和IO结线混合,这是不幸的是击落。
  • 的空载燕子的工作 拟议的合并 在Python3.3,但这已被撤销,由于缺乏结果在这一项目。 PyPy 现在是优选项目和目前正 请求的资金 添加Python3k支持。有很少的机会,PyPy将成为默认。

已经作出努力,在过去15年中删除GIL从CPython但在可预见的将来它是留在这里。

在GIL不会影响你的代码不使用Python对象。在NumPy的,我们释放GIL的计算代码(线性代数电话,等...),和底层代码可以自由使用多线程(其实,那些不知道什么蟒蛇一般的第三方库)

在GIL是好事。

只是让你的C ++应用程序释放GIL是做多线程的工作时间。 Python代码将继续在其他线程运行,未受污染。只有当你需要触摸Python对象获得GIL。

我想总是会有一个GIL。 原因是性能。使所有的低级别的访问线程安全的 - 是指将一个互斥体周围的每个哈希运算等较重。请记住,简单的声明等

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

可能已经有至少3(如果val是一个全球性的)散列表的时刻和查找甚至更多,如果该方法的高速缓存不热(取决于类的继承深度)

它是昂贵的 - 这就是为什么Java的打消了这个念头,并引入了不使用显示器哈希表调用摆脱其“Java是慢”商标

据我所知的“brainfuck”调度器将来自蟒3.2更换GIL

BFS bainfuck调度

如果该GIL被的方式获得,只是使用多处理模块。它生成新的进程,但使用的线程模型和(大多数)的API。换言之,可以在螺纹状的方式做基于过程的并行度。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top