我们计划用任何一种非常高级的编程语言编写一个高度并发的应用程序。
1) Python、Ruby 或 Haskell 是否支持真正的多线程?
2) 如果程序包含线程,虚拟机是否会自动将工作分配给多个内核(如果主板上有超过 1 个 CPU,则分配给物理 CPU)?
真正的多线程 = 多个独立的执行线程利用多个内核提供的资源(不仅仅是一个内核)。
假多线程 = 线程模拟多线程环境,不依赖任何 native 操作系统功能。
最佳答案
1) Do Python, Ruby, or Haskell support true multithreading?
这与语言无关。这是硬件的问题(如果机器只有 1 个 CPU,在物理上根本不可能同时执行两条指令),操作系统(同样,如果操作系统不支持真正的多线程,则什么都没有你可以做)和语言实现/执行引擎。
除非语言规范明确禁止或强制执行真正的多线程,否则这与语言完全无关。
所有您提到的语言,以及迄今为止在答案中提到的所有语言,都有多种实现,其中一些支持真正的多线程,一些不支持,还有一些是建立在其他执行引擎之上,可能支持也可能不支持真正的多线程。
以 Ruby 为例。以下是它的一些实现及其线程模型:
- MRI:绿色线程,没有真正的多线程
- YARV:操作系统线程,没有真正的多线程
- Rubinius:操作系统线程,真正的多线程
- MacRuby:操作系统线程,真正的多线程
- JRuby、XRuby:JVM 线程,依赖于 JVM(如果 JVM 支持真正的多线程,那么 JRuby/XRuby 也支持,如果 JVM 不支持,那么 他们 无能为力关于它)
- IronRuby、Ruby.NET:就像 JRuby、XRuby,但在 CLI 上而不是在 JVM 上
另见 my answer to another similar question about Ruby . (请注意,该答案已有一年多的历史了,其中一些不再准确。例如,Rubinius 现在使用真正并发的本地线程,而不是真正并发的绿色线程。此外,从那时起,几个 new Ruby 实现已经出现,例如 BlueRuby、tinyrb、Ruby Go Lightly、Red Sun 和 SmallRuby。)
Python 类似:
- CPython:原生线程,没有真正的多线程
- PyPy:本地线程,依赖于执行引擎(PyPy 可以本地运行,也可以在 JVM 之上,或者在 CLI 之上,或者在 另一个 Python 执行引擎之上。无论何时底层平台支持真正的多线程,PyPy 也支持。)
- Unladen Swallow:原生线程,目前没有真正的多线程,但计划修复
- Jython:JVM 线程,参见 JRuby
- IronPython:CLI 线程,请参阅 IronRuby
对于 Haskell,至少 Glorious Glasgow Haskell 编译器支持使用本地线程的真正多线程。我不知道 UHC、LHC、JHC、YHC、HUGS 或所有其他的。
对于 Erlang,BEAM 和 HiPE 都支持真正的多线程和绿色线程。
2) If a program contains threads, will a Virtual Machine automatically assign work to multiple cores (or to physical CPUs if there is more than 1 CPU on the mainboard)?
再次重申:这取决于虚拟机、操作系统和硬件。此外,上面提到的一些实现甚至没有虚拟机。
关于Python、Ruby、Haskell——它们提供真正的多线程吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1920805/