Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ssis/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 3.1中的GIL 有人知道在Python 3.1上锁定全局解释者的命运,反对C++多线程集成 < P >吉尔仍然存在于CPython 3.1;这些项目的目标(在许多其他性能提升中)是最终删除它,但它离目标还有一段距离,并且正在首先开发2.6,目的是最终移植到3.x,在考虑完成2.y版本时,无论x是最新的。目前,多进程(而不是线程)仍然是在Cpython中使用多个内核的选择方式(IrPython和Jython也很好,但是它们目前不支持Python 3,也不使C++集成变得简单;-)吉尔是一件好事。 >让你的C++应用程序在吉尔做多线程工作时释放它。Python代码将继续在其他线程中运行,不会受到破坏。仅当您必须接触python对象时才获取GIL。_Python_Multithreading_Gil - Fatal编程技术网

Python 3.1中的GIL 有人知道在Python 3.1上锁定全局解释者的命运,反对C++多线程集成 < P >吉尔仍然存在于CPython 3.1;这些项目的目标(在许多其他性能提升中)是最终删除它,但它离目标还有一段距离,并且正在首先开发2.6,目的是最终移植到3.x,在考虑完成2.y版本时,无论x是最新的。目前,多进程(而不是线程)仍然是在Cpython中使用多个内核的选择方式(IrPython和Jython也很好,但是它们目前不支持Python 3,也不使C++集成变得简单;-)吉尔是一件好事。 >让你的C++应用程序在吉尔做多线程工作时释放它。Python代码将继续在其他线程中运行,不会受到破坏。仅当您必须接触python对象时才获取GIL。

Python 3.1中的GIL 有人知道在Python 3.1上锁定全局解释者的命运,反对C++多线程集成 < P >吉尔仍然存在于CPython 3.1;这些项目的目标(在许多其他性能提升中)是最终删除它,但它离目标还有一段距离,并且正在首先开发2.6,目的是最终移植到3.x,在考虑完成2.y版本时,无论x是最新的。目前,多进程(而不是线程)仍然是在Cpython中使用多个内核的选择方式(IrPython和Jython也很好,但是它们目前不支持Python 3,也不使C++集成变得简单;-)吉尔是一件好事。 >让你的C++应用程序在吉尔做多线程工作时释放它。Python代码将继续在其他线程中运行,不会受到破坏。仅当您必须接触python对象时才获取GIL。,python,multithreading,gil,Python,Multithreading,Gil,GIL不会影响不使用python对象的代码。在Numpy中,我们为计算代码(线性代数调用等)发布了GIL,底层代码可以自由使用多线程(事实上,这些通常是对python一无所知的第三方库)我想总会有GIL。 原因是性能。使所有的低级访问线程安全-意味着在每个哈希操作周围放置一个互斥锁等是很繁重的。记住一个简单的语句,比如 self.foo(self.bar, 3, val) 目前可能已经有至少3次(如果val是全局的)哈希表查找,如果方法缓存不是热的(取决于类的继承深度),可能会有更多的哈希表查

GIL不会影响不使用python对象的代码。在Numpy中,我们为计算代码(线性代数调用等)发布了GIL,底层代码可以自由使用多线程(事实上,这些通常是对python一无所知的第三方库)

我想总会有GIL。 原因是性能。使所有的低级访问线程安全-意味着在每个哈希操作周围放置一个互斥锁等是很繁重的。记住一个简单的语句,比如

self.foo(self.bar, 3, val)
目前可能已经有至少3次(如果val是全局的)哈希表查找,如果方法缓存不是热的(取决于类的继承深度),可能会有更多的哈希表查找


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

Python 3.2的GIL将发生重大变化。看一看,然后

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

更新0
  • 安托万·皮特罗(Antoine Pitrou)在3.2版中推出的新GIL的总体性能提升可以忽略不计,而是专注于某些角落案例中出现的性能提升
  • David Beazley的一篇文章是为了实现一个调度器,当CPU和IO绑定线程混合时,它可以显著提高性能,但不幸的是,它被击落了
  • unladenswallow的工作是在Python3.3中完成的,但由于该项目中缺乏结果,这项工作已被撤销。现在是首选项目,目前正在添加Python3k支持。目前PyPy成为默认值的可能性很小
在过去的15年中,我们一直在努力从CPython中删除GIL,但在可预见的未来,它将继续存在。

据我所知,“brainfuck”调度程序将取代python 3.2中的GIL


如果GIL挡住了去路,只需使用模块即可。它产生新进程,但使用线程模型和(大部分)api。换句话说,您可以以类似线程的方式实现基于进程的并行。

谢谢您的回答。IronPython自与CLR集成后有望拥有多线程解决方案。但我的任务是将Python插入到现有的跨平台C++应用程序中。这就是为什么无论是IppyPython还是多处理看起来都不错。C++的应用程序不会受到吉尔的影响,只要Python中的所有入口点都使用适当的宏来允许自由线程化——只有Python自己的执行将被序列化(吉尔在I/O和C中被无论如何丢弃)。IronCoad提供了一些(但不完整)的帮助,提供了IronPythonC/C++接口,但“多平台”不是.NET目前的优势;我知道Jython没有类似的助手,但这正是我想要的——同时运行多个插入式脚本。即使两个同时执行的Python块不使用公共资源,这个想法仍然存在。关于Jython和IronPython如何解决同一问题的任何信息?@Pavel,IronPython使用.Net方法-只有显式“声明”的方法是线程安全的,因为它是动态语言(由.Net 3.5提供).py和C#代码之间没有区别。@Lothar您的示例绑定到GIL的实现,这就是为什么我强烈反对“可能已经至少有3个…”。另一种方法,例如,可以是公寓模型——您可以在公寓中启动Python实例,并将代码与C++混合。同步是程序员的响应。当两个或更多线程需要协作时,您可以按需提供这些线程。不知道单元模型是什么,我猜您只是指分开的内存空间。是的,TCL就是这样做的,但它只是多处理模型的一种不同的实现风格。对我来说,线程总是意味着共享内存,因此您必须共享解释器实例和python运行时。运行时和解释器有许多需要保护的内部结构。即使您不在乎是否允许python程序使解释器崩溃,您也需要一个GIL或一些同步。@Matt Joiner我正聚精会神地注视着“Unladen Swallow”()项目。就我的问题而言,这是唯一的解决办法。@Dewfy,我看了一眼unladen swallow,他们公开承认他们并不像他们希望的那样成功。他们的努力可能会被合并到Python3.3中,但是,让我们为Python3.3在多线程方面取得成功而祈祷吧。这与我的问题无关。您是从Python开发人员的角度进行讨论的。我关心的是C++开发者的观点,这是不发生的,它被拒绝了。(