2010-11-19 83 views
5

在Jython中可能会遇到多线程/并行性瓶颈的常见隐藏事件是什么?我有一些并行的代码(使用Python的线程库),将不能扩展过去的3-4个CPU,我敢肯定,这是因为这些明显的缺陷不是:Jython中隐藏的多线程瓶颈?

  • 明确锁

  • 调用库代码需要同步(我试图并行基本上是从头开始编写,并且不使用任何库的算法。)

基本上所有的算法确实是一串字符串处理的,名单和字典查找和数学。我的理解是,与CPython不同,Jython没有GIL。

+0

我会检查一下垃圾收集是否会在JVM级别伤害你。这个文档有很多关于这方面的信息:http://www.oracle.com/technetwork/java/gc-tuning-5-138395.html – 2010-11-19 22:54:03

回答

3

Jython没有GIL,但获得很多并行性非常困难。如果您有不能并行进行的任何部分,你被咬伤Ahmdahl's Law

使用多个处理器并行计算程序的加速是通过所需程序的顺序部分的时间限制。

此外,即使您进行纯粹的并行计算,您也会受到其他事物的困扰,例如紧张缓存。还要记住,你的代码是在虚拟机的顶部运行的,所以即使你的代码是纯粹的并行的,JVM可能会有一些内部协调让你回避(垃圾收集是一个明显的候选)。

4

访问的变量是那些“隐藏”的瓶颈之一。如果所有线程都访问某些共享数据结构,则线程之间会进行同步。

Jython尽力实现与CPython的语言兼容性。 GIL确保的一件事是访问局部/全局变量,对象成员,字典元素(技术上来说局部变量,全局变量和对象成员也是字典元素),甚至列表元素都是原子的。为了避免用户感到意外,Jython使用并发哈希映射来实现字典。这意味着在访问Jython中的任何类型的字典元素时会发生一些同步。这个sycnhronization是支持从多线程访问字典而不阻塞它们的,但是如果多个线程访问相同的变量,他们将会碰到相同的锁。

实现Jython和任何其他语言的可伸缩性的最佳方法是确保您在每个线程中访问的数据不会从其他线程访问。

1

您是否尝试过任何performance analysis软件包?即使他们没有明确地使用Jython,我敢打赌它会提供一些帮助。

如果您有权访问许可证,我会首先尝试YourKit