在Jython中,哪些常见的隐藏事物会导致多线程/并行性瓶颈?我有一些并行代码(使用Python的线程库)不会扩展到3-4个CPU,而且我相信这不是因为这些明显的缺陷:
基本上,算法所做的就是一堆字符串处理、列表和字典查找以及数学。我的理解是,与CPython不同,Jython没有GIL。
发布于 2010-11-19 23:00:26
访问变量是这些“隐藏”瓶颈之一。如果所有线程都访问某些共享数据结构,那么线程之间就会同步。
Jython努力实现与CPython的语言兼容性。GIL确保访问局部变量/全局变量、对象成员、dict元素(从技术上讲,局部变量、全局元素和对象成员也是dict元素)甚至列表元素都是原子元素。为了避免给用户带来惊喜,Jython使用并发散列映射来实现dicts。这意味着在访问Jython中的任何类型的dict元素时都会进行一些同步。这个sycnhronization是带条的,以支持从多个线程访问dict而不阻塞它们,但是如果多个线程访问相同的变量,它们就会命中相同的锁。
在Jython和任何其他语言中实现可伸缩性的最佳方法是确保您在每个线程中访问的数据也不会从其他线程访问。
发布于 2010-11-19 18:16:06
Jython没有GIL,但是很难获得大量的并行性。如果你有任何不能并行完成的部分,你就会被[医]阿姆达尔定律咬伤
并行计算中使用多个处理器的程序的加速比取决于程序的顺序部分所需的时间。
而且,即使你做了纯粹的并行计算,你也会被其他东西咬到,比如耗尽你的缓存。还请记住,您的代码运行在虚拟机之上,所以即使您的代码纯粹是并行的,JVM也可能有一些内部协调阻碍您(垃圾收集是一个明显的候选)。
发布于 2010-11-20 02:09:31
您试过任何性能分析包吗?即使它们没有显式地支持Jython,我相信它也会提供一些帮助。
如果你有许可证的话,我会先试试YourKit。
https://stackoverflow.com/questions/4227269
复制相似问题