Python 逃避 GIL 的线程并行化
Python thread parallelization escaping the GIL
我正在改写我的问题,因为我认为很多人认为这是问题 "does python have threads"。它确实如此,但 CPython 也有 GIL,它永远不会在任何给定时间调度超过一个线程。这使得 CPython 线程无法用于 cpu 密集型计算。
我需要使用线程;由于 IPC 成本(我有大型共享对象),进程并行性对我不起作用。
我目前正在将 Jython(无 GIL)与 JyNI 结合使用,以便我可以使用 numpy。 JyNI 是 alpha,但它现在支持 numpy。我得到这个工作。然而,JyNI 是 alpha 和 bug,整个过程很慢。
我读了一堆旧线程。我想知道从那以后是否有可行的选择?我被迫使用 python 2.7.
谢谢。
目前,Jython 仍然比 CPython 慢很多。根据程序和 JIT 优化它的程度,多线程可能会或可能不会得到回报。 Jython 的主要设计目标是兼容性,而不是性能。它主要用于胶水代码,仍有很大的效率提升潜力。参见例如zippy 在 Java 中实现了极快的 Python 实现,但是它是实验性的并且缺乏 Jython 的兼容性级别。在某种程度上,这代表了相反的设计目标。
现在将 JyNI 添加到 Jython 中并不能使它更快,但到目前为止,我发现 JyNI 中的性能优化还为时过早,通常 Jython 部分无论如何都会支配运行时。另外,例如对于 NumPy,本机数字工作量在胶水代码成本中占主导地位。
最后,请注意 JyNI 必须在 C 端模拟 GIL。有关详细信息,请查看论文 https://arxiv.org/abs/1607.00825。也许可以在没有 GIL 的情况下操作某些扩展——这取决于实现细节,扩展对此的敏感程度。目前 C 端 GIL 是强制性的。这就是为什么您在使用 NumPy 时可能无法从 Java 多线程中获益。 C 扩展可以选择显式释放 GIL,例如在不与解释器交互的计算密集型操作期间。不知道NumPy有没有利用这个。
JyNI is alpha and buggy
请确保在问题跟踪器中报告错误。
我正在改写我的问题,因为我认为很多人认为这是问题 "does python have threads"。它确实如此,但 CPython 也有 GIL,它永远不会在任何给定时间调度超过一个线程。这使得 CPython 线程无法用于 cpu 密集型计算。
我需要使用线程;由于 IPC 成本(我有大型共享对象),进程并行性对我不起作用。
我目前正在将 Jython(无 GIL)与 JyNI 结合使用,以便我可以使用 numpy。 JyNI 是 alpha,但它现在支持 numpy。我得到这个工作。然而,JyNI 是 alpha 和 bug,整个过程很慢。
我读了一堆旧线程。我想知道从那以后是否有可行的选择?我被迫使用 python 2.7.
谢谢。
目前,Jython 仍然比 CPython 慢很多。根据程序和 JIT 优化它的程度,多线程可能会或可能不会得到回报。 Jython 的主要设计目标是兼容性,而不是性能。它主要用于胶水代码,仍有很大的效率提升潜力。参见例如zippy 在 Java 中实现了极快的 Python 实现,但是它是实验性的并且缺乏 Jython 的兼容性级别。在某种程度上,这代表了相反的设计目标。
现在将 JyNI 添加到 Jython 中并不能使它更快,但到目前为止,我发现 JyNI 中的性能优化还为时过早,通常 Jython 部分无论如何都会支配运行时。另外,例如对于 NumPy,本机数字工作量在胶水代码成本中占主导地位。
最后,请注意 JyNI 必须在 C 端模拟 GIL。有关详细信息,请查看论文 https://arxiv.org/abs/1607.00825。也许可以在没有 GIL 的情况下操作某些扩展——这取决于实现细节,扩展对此的敏感程度。目前 C 端 GIL 是强制性的。这就是为什么您在使用 NumPy 时可能无法从 Java 多线程中获益。 C 扩展可以选择显式释放 GIL,例如在不与解释器交互的计算密集型操作期间。不知道NumPy有没有利用这个。
JyNI is alpha and buggy
请确保在问题跟踪器中报告错误。