代码之家  ›  专栏  ›  技术社区  ›  psihodelia

python、ruby、haskell——它们提供真正的多线程吗?

  •  16
  • psihodelia  · 技术社区  · 15 年前

    我们计划用任何高级编程语言编写一个高度并发的应用程序。

    1)python、ruby或haskell是否支持真正的多线程?

    2)如果程序包含线程,虚拟机是否会自动将工作分配给多个核心(如果主板上有多个CPU,则分配给物理CPU)?

    真正的多线程 =多个独立的执行线程使用多个核心提供的资源(而不是仅由一个核心提供)。

    假多线程 =线程模拟多线程环境,而不依赖任何本机操作系统功能。

    8 回复  |  直到 9 年前
        1
  •  33
  •   Jörg W Mittag    15 年前

    1)python、ruby或haskell是否支持真正的多线程?

    这与语言无关。这是一个硬件问题(如果机器只有1个CPU,那么在物理上就不可能同时执行两个指令)、操作系统(同样,如果操作系统不支持真正的多线程,那么您也无能为力)和语言实现/执行引擎。

    除非语言规范明确禁止或强制执行真正的多线程,否则这与语言完全无关。

    所有 您提到的语言,加上到目前为止答案中提到的所有语言,都有多个实现,其中一些支持真正的多线程,一些不支持,还有一些构建在 其他 可能支持或不支持真正多线程的执行引擎。

    以Ruby为例。这里只是 一些 其实现及其线程模型:

    • MRI:绿色线程,没有真正的多线程
    • 操作系统线程,没有真正的多线程
    • Rubinius:OS线程,真正的多线程
    • MacRuby:OS线程,真正的多线程
    • jruby,xruby:jvm线程,取决于jvm(如果jvm支持真正的多线程,那么jruby/xruby也支持,如果jvm不支持,那么就没有什么了 他们 可以做的)
    • IronRuby,ruby.net:就像jruby、xruby一样,但是在cli上而不是在jvm上

    也见 my answer to another similar question about Ruby .(请注意,该答案已有一年多的历史,其中一些已不再准确。例如,Rubinius现在使用真正并发的本机线程,而不是真正并发的绿色线程。而且,从那时起,几个 新的 Ruby实现已经出现,如BlueRub、Tinyrb、Ruby Go Lightly、Red Sun和SmallRuby。)

    类似于python:

    • cpython:本机线程,没有真正的多线程
    • pypy:本机线程,取决于执行引擎(pypy可以本机运行,也可以在jvm上运行,或者在cli上运行,或者在 另一个 python执行引擎。每当底层平台支持真正的多线程时,pypy也会这样做。)
    • unladen swallow:本机线程,目前没有真正的多线程处理,但计划修复
    • jython:jvm线程,参见jruby
    • Ironpython:cli线程,请参见IronRuby

    对于haskell,至少光荣的glasgow haskell编译器支持真正的多线程本地线程。我不知道UHC,LHC,JHC,YHC,拥抱或所有其他的。

    对于厄尔朗, 二者都 BEAM和HIPE支持真正的绿色螺纹多线程。

    2)如果程序包含线程,虚拟机是否会自动将工作分配给多个核心(如果主板上有多个CPU,则分配给物理CPU)?

    再次说明:这取决于虚拟机、操作系统和硬件。另外,上面提到的一些实现,甚至 虚拟机。

        2
  •  22
  •   igouy peenut    9 年前

    haskell实现(ghc)支持在共享内存多核上并行执行的多个机制。这些机制在 Runtime Support for Multicore Haskell “。

    具体来说,haskell运行时将工作划分为N个OS线程,分布在可用的计算核心上。这些N OS线程依次运行m轻量级haskell线程(有时有数百万个)。反过来,每个haskell线程都可以为一个火花队列(可能有数十亿个火花)工作。像这样: enter image description here

    运行时调度工作将在单独的核心上执行,迁移工作和负载平衡。垃圾收集器也是一个并行的,使用每个核心来收集堆的一部分。

    与python或ruby不同的是,没有全局解释器锁,因此出于这个原因和其他原因,与之相比,ghc在mulitcore上尤其出色,例如。 Haskell v Python on the multicore shootout

        3
  •  16
  •   dave4420    15 年前

    如果使用 -threaded 选择然后通过 +RTS -N<x> -RTS 在运行时,其中 <x> =所需的OS线程数。

        4
  •  7
  •   khelll    15 年前

    Ruby1.9的当前版本(基于yarv-c的版本)具有本机线程,但存在gil问题。我知道python也有gil的问题。

    但是Jython和JuRube(露比和Python的成熟Java实现)都提供了本地多线程,没有绿色线程,也没有吉尔。

    不知道哈斯克尔。

        5
  •  1
  •   Svetlozar Angelov    15 年前

    haskell具有线程功能,此外, pure 功能语言-否 side effects

        6
  •  1
  •   Daniel Roseman    15 年前

    对于真正的并发性,您可能希望尝试erlang。

        7
  •  1
  •   Richie    15 年前

    我选择了二郎。Erlang可以即时支持分布式高并发编程。不管你叫“多线程”还是“多处理”。需要考虑的两个重要元素是并发级别和Erlang处理的事实 不共享 状态。

    进程之间没有共享状态是一件好事。

        8
  •  -2
  •   Vasiliy Stavenko    15 年前

    哈斯克尔什么都适合。 蟒蛇 processing 模块,这(我想-不确定)有助于避免GIL问题。(所以它也适用于任何事物)。

    但是我的观点——你能做的最好的方法是为大的和大的事情选择最高级别的可能的静态类型系统语言。今天的语言是:ocaml,haskell,erlang。

    如果你想开发小东西-python很好。但是当事情变得更大时,所有的python好处都会被测试的miriad所吞噬。

    我没有用红宝石。我仍然认为Ruby是一种玩具语言。(或者至少当你了解python的时候没有理由教ruby——最好是读sicp的书)。