我们计划用任何一种高级编程语言编写一个高度并发的应用程序。
1) Python、Ruby或Haskell是否支持真正的多线程?
2)如果程序包含线程,虚拟机是否会自动将工作分配给多个核心(如果主板上有多个CPU,则会自动分配给物理CPU)?
真正的多线程=多个独立的执行线程利用多个核心(而不仅仅是一个核心)提供的资源。
False多线程=线程模拟多线程环境,不依赖任何本机操作系统功能。
发布于 2009-12-17 21:35:17
1) Python、Ruby或Haskell是否支持真正的多线程?
这与语言无关。这是硬件(如果机器只有一个CPU,在物理上根本不可能同时执行两条指令)、操作系统(同样,如果操作系统不支持真正的多线程,您就无能为力)和语言实现/执行引擎的问题。
除非语言规范明确禁止或强制执行真正的多线程,否则这与语言没有任何关系。
您提到的所有语言,加上到目前为止在答案中提到的所有语言,都有多种实现,其中一些支持真正的多线程,一些不支持,还有一些构建在其他可能支持也可能不支持真正多线程的执行引擎之上。
以Ruby为例。下面是它的一些实现和线程模型:
JRuby:绿色线程,没有真正的multithreading
上
另请参见my answer to another similar question about Ruby。(请注意,这个答案已经有一年多了,其中一些已经不再准确了。例如,Rubinius现在使用真正的并发原生线程,而不是真正的并发绿色线程。此外,从那时起,出现了几个新的Ruby实现,例如BlueRuby、tinyrb、Ruby Go Lightly、Red Sun和SmallRuby。)
与Python类似:
Python :原生线程,没有真正的multithreading
对于Haskell来说,至少Glasgow Haskell编译器支持本机线程的真正多线程。我不知道UHC,LHC,JHC,YHC,HUGS或所有其他的。
对于Erlang,BEAM和HiPE都支持使用绿色线程的真正多线程。
2)如果程序包含线程,虚拟机是否会自动将工作分配给多个核心(如果主板上有多个CPU,则会自动分配给物理CPU)?
再说一次:这取决于虚拟机、操作系统和硬件。此外,上面提到的一些实现甚至没有虚拟机。
发布于 2009-12-18 07:04:44
Haskell实现GHC支持在共享内存多核上并行执行的多种机制。这些机制在"Runtime Support for Multicore Haskell“中有描述。
具体地说,Haskell运行时将工作划分为N个OS线程,分布在可用的计算核心上。这N个OS线程依次运行M个轻量级Haskell线程(有时多达数百万个)。反过来,每个Haskell线程可以接受一个spark队列的工作(可能有数十亿个spark)。如下所示:
运行时将工作安排在单独的核心上执行,迁移工作和负载平衡。垃圾收集器也是一个并行的收集器,使用每个核心来收集堆的一部分。
与Python或Ruby不同的是,GHC没有全局解释器锁,因此,与其他原因相比,GHC在多核上特别好用,例如Haskell v Python on the multicore shootout
发布于 2009-12-17 19:00:29
如果使用-threaded
选项编译,然后在运行时传递+RTS -N<x> -RTS
(其中<x>
=所需的OS线程数),那么GHC编译器将在多个OS线程(从而多个内核)上运行您的程序。
https://stackoverflow.com/questions/1920805
复制相似问题