java - Jython 中隐藏的多线程瓶颈?

标签 java python multithreading jvm jython

Jython 中有哪些常见的隐藏因素可能会阻碍多线程/并行性?我有一些并行代码(使用 Python 的线程库)不会超过 3-4 个 CPU,而且我确信这不是因为这些明显的缺陷:

  • 显式锁

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

基本上,算法所做的只是一堆字符串处理、列表和字典查找以及数学运算。我的理解是,与 CPython 不同,Jython 没有 GIL。

最佳答案

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

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

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

关于java - Jython 中隐藏的多线程瓶颈?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4227269/

相关文章:

java - 在 Java 中获取 Spark 中的当前任务 ID

python - 为模块中的所有类覆盖 __init__

android - 独立工作线程还是 IntentService?

c# - 如果我从 Albahari 的生产者/消费者队列实现中删除 lock() 会发生什么

c# - 如果我只想以线程安全的方式测试和设置标志,那么线程类是什么?

java - 无法访问内部类中的变量,但我需要更改该变量,所以我也不能将其声明为final

java - Maven忽略找不到特定包的符号

java - 存储数据表的最佳方式

Python Celery - 通过 pid 查找任务

python - 如何在 Cython 中使用 openMP 之类的东西?