【问题标题】:Hidden Multithreading Bottlenecks in Jython?Jython 中隐藏的多线程瓶颈?
【发布时间】:2011-05-12 18:04:40
【问题描述】:
有哪些常见的隐藏事物会阻碍 Jython 中的多线程/并行性?我有一些并行代码(使用 Python 的线程库)无法扩展超过 3-4 个 CPU,我确信这不是因为这些明显的缺陷:
基本上所有的算法都是一堆字符串处理、列表和字典查找以及数学。我的理解是,与 CPython 不同,Jython 没有 GIL。
【问题讨论】:
标签:
java
python
multithreading
jvm
jython
【解决方案1】:
访问变量是那些“隐藏”的瓶颈之一。如果所有线程都访问一些共享数据结构,那么线程之间就会同步。
Jython 努力实现与 CPython 的语言兼容性。 GIL 确保的一件事是对局部/全局变量、对象成员、dict 元素(技术上本地、全局和对象成员也是 dict 元素)甚至列表元素的访问是原子的。为了避免让用户感到意外,Jython 使用并发散列映射来实现 dicts。这意味着在访问 Jython 中的任何类型的 dict 元素时都会进行一些同步。这种同步是条带化的,以支持从多个线程访问 dict 而不会阻塞它们,但是如果多个线程访问同一个变量,它们将命中同一个锁。
在 Jython 和任何其他语言中实现可伸缩性的最佳方法是确保您在每个线程中访问的数据也不会从其他线程中访问。
【解决方案2】:
Jython 没有 GIL,但很难获得大量并行性。如果你有任何部分不能并行完成,你会被Ahmdahl's Law咬:
在并行计算中使用多个处理器的程序的加速受到程序顺序部分所需时间的限制。
此外,即使您进行纯粹的并行计算,您也会受到其他因素的影响,例如缓存过度。还要记住,您的代码是在虚拟机上运行的,因此即使您的代码是纯并行的,JVM 也可能有一些内部协调阻碍您(垃圾收集是一个明显的候选者)。