题
有没有人知道命运的全球解释锁在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
如果该GIL被的方式获得,只是使用多处理模块。它生成新的进程,但使用的线程模型和(大多数)的API。换言之,可以在螺纹状的方式做基于过程的并行度。