在Jython中有哪些常见的隐藏事物会阻碍多线程/并行性?我有一些并行代码(使用Python的线程库),它不会扩展到3-4个CPU,我相信这不是因为这些明显的陷阱:
明确锁定
调用需要同步的库代码(我尝试并行化的算法基本上是从头开始编写的,不使用任何库。)
基本上所有的算法都是一堆字符串处理,列表和字典查找和数学。我的理解是,与CPython不同,Jython没有GIL。
答案 0 :(得分:4)
访问变量是其中一个“隐藏”的瓶颈。如果所有线程都访问某些共享数据结构,则线程之间将存在同步。
Jython努力实现与CPython的语言兼容性。 GIL确保的一件事是访问本地/全局变量,对象成员,dict元素(技术上本地,全局和对象成员也是dict元素)甚至列表元素都是原子的。为了避免用户出现意外,Jython使用并发哈希映射来实现dicts。这意味着在访问Jython中的任何类型的dict元素时会发生一些同步。这个sycnhronization是条带化的,支持从多个线程访问dict而不会阻塞它们,但是如果多个线程访问同一个变量,它们将会遇到相同的锁。
在Jython和任何其他语言中实现可伸缩性的最佳方法是确保不会从其他线程访问您在每个线程中访问的数据。
答案 1 :(得分:3)
Jython没有GIL,但很难获得很多并行性。如果你有任何不能同时完成的部分,你会被Ahmdahl's Law:
咬伤在并行计算中使用多个处理器的程序的加速受到程序序列部分所需时间的限制。
此外,即使您进行纯粹的并行计算,也会受到其他因素的影响,例如使缓存过度紧张。还要记住,您的代码是在虚拟机之上运行的,因此即使您的代码纯粹是并行的,JVM也可能会有一些内部协调来阻止您(垃圾收集是一个明显的候选者)。
答案 2 :(得分:1)
您是否尝试过任何performance analysis套餐?即使他们没有明确表示Jython,我敢打赌它会提供一些帮助。
如果您有权访问许可证,我会先尝试YourKit。