逃离GIL的Python线程并行化

逃离GIL的Python线程并行化,python,jython,gil,jyni,Python,Jython,Gil,Jyni,我重新表述我的问题,因为我想很多人认为这是一个“python是否有线程”的问题。确实如此,但CPython也有GIL,它在任何给定时间都不会调度多个线程。这使得CPython线程对于cpu密集型计算毫无用处 我需要使用线程;进程并行性对我来说不起作用,因为IPC成本太高(我有很大的共享对象) 我目前正在使用Jython(无GIL)和JyNI,这样我就可以使用numpy了。JyNI是alpha,但它现在确实支持numpy。我让它工作。然而,JyNI是alpha和buggy,整个过程很慢 我读过一堆

我重新表述我的问题,因为我想很多人认为这是一个“python是否有线程”的问题。确实如此,但CPython也有GIL,它在任何给定时间都不会调度多个线程。这使得CPython线程对于cpu密集型计算毫无用处

我需要使用线程;进程并行性对我来说不起作用,因为IPC成本太高(我有很大的共享对象)

我目前正在使用Jython(无GIL)和JyNI,这样我就可以使用numpy了。JyNI是alpha,但它现在确实支持numpy。我让它工作。然而,JyNI是alpha和buggy,整个过程很慢

我读过一堆旧文章。我想知道从那时起是否有一个可行的选择?我被迫使用python 2.7


谢谢。

目前,Jython仍然比CPython慢很多。根据程序以及JIT对其进行优化的程度,多线程可能会有回报,也可能不会有回报。Jython的主要设计目标是兼容性,而不是性能。它主要用于粘合代码,在提高效率方面仍有很大潜力。参见例如zippy,了解Java中速度极快的Python实现,但是它是实验性的,缺乏Jython的兼容性级别。在某种程度上,这代表了相反的设计目标

现在,将JyNI添加到Jython并不能让它更快,但到目前为止,我发现JyNI中的性能优化还为时过早,而且通常Jython部分会主导运行时。此外,例如,对于NumPy,本机数字工作负载在很大程度上决定了粘合代码的成本

最后,请注意,JyNI必须在C端模拟GIL。详情请看报纸。也许在没有GIL的情况下操作某些扩展是可能的——这取决于实现细节,以及扩展对GIL的敏感程度。目前,C端GIL是强制性的。这就是为什么在使用NumPy时,您可能无法从Java多线程中获益。C-extensions可以选择显式释放GIL,例如在不与解释器交互的计算密集型操作期间。我不知道NumPy是否利用了这个

JyNI是阿尔法和童车


请确保在问题跟踪器上报告错误。

您始终可以编写C扩展或使用Cython。您是如何得出IPC速度慢的结论的?我在中听到了另一个关于共享记忆的观点。我进行了实验。我用的是巨大的共享矩阵,