Jython中的隐性多线程瓶颈?

5 投票
3 回答
1054 浏览
提问于 2025-04-16 07:20

在Jython中,有哪些常见的隐藏问题可能会导致多线程或并行处理的瓶颈呢?我有一些并行代码(使用Python的线程库),它的性能在3到4个CPU上就停滞不前,我相信这不是因为一些明显的问题:

  • 显式锁

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

这个算法主要是进行一些字符串处理、列表和字典查找以及数学运算。我的理解是,与CPython不同,Jython没有全局解释器锁(GIL)。

3 个回答

1

你有没有试过一些 性能分析 的工具包?即使这些工具不是专门为Jython设计的,我相信它们也能提供一些帮助。

如果你有许可证的话,我建议你先试试 YourKit

3

Jython没有全局解释器锁(GIL),但要实现很多并行处理还是挺困难的。如果你的程序里有任何部分不能并行执行,就会受到阿姆达尔定律的影响:

在并行计算中,使用多个处理器加速程序的速度是有限的,这个限制来自于程序中需要顺序执行的部分所花费的时间。

而且,即使你完全采用并行计算,还是会遇到其他问题,比如缓存的压力。同时要记住,你的代码是运行在一个虚拟机上的,所以即使你的代码是完全并行的,JVM(Java虚拟机)内部可能也会有一些协调机制会拖慢你的速度(垃圾回收就是一个明显的例子)。

4

访问变量是一个“隐藏”的瓶颈问题。如果多个线程同时访问一些共享的数据结构,就会出现线程之间的同步问题。

Jython努力与CPython保持语言兼容性。GIL(全局解释器锁)确保了对局部变量、全局变量、对象成员、字典元素(实际上,局部变量、全局变量和对象成员也可以看作字典元素)甚至列表元素的访问是原子的,也就是说,这些操作是不可分割的。为了避免用户遇到意外情况,Jython使用了一个并发哈希表来实现字典。这意味着在Jython中访问任何字典元素时,都会进行一些同步处理。这个同步处理是经过优化的,可以支持多个线程同时访问字典而不会相互阻塞,但如果多个线程访问同一个变量,它们就会碰到同一个锁。

在Jython以及其他任何语言中,实现可扩展性的最佳方法是确保每个线程访问的数据不被其他线程同时访问。

撰写回答