首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Python、Ruby、Haskell -它们提供真正的多线程吗?

Python、Ruby、Haskell -它们提供真正的多线程吗?
EN

Stack Overflow用户
提问于 2009-12-17 18:33:04
回答 8查看 7.2K关注 0票数 16

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

1) Python、Ruby或Haskell是否支持真正的多线程?

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

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

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

EN

回答 8

Stack Overflow用户

回答已采纳

发布于 2009-12-17 21:35:17

1) Python、Ruby或Haskell是否支持真正的多线程?

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

除非语言规范明确禁止或强制执行真正的多线程,否则这与语言没有任何关系。

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

以Ruby为例。下面是它的一些实现和线程模型:

JRuby:绿色线程,没有真正的multithreading

  • YARV: OS线程,没有真正的multithreading

  • Rubinius: OS线程,真正的multithreading

  • MacRuby: OS线程,真正的multithreading

  • JRuby,线程,依赖于it)

  • IronRuby,(如果支持真正的多线程,那么
  • /XRuby也支持,如果JVM不支持,那么它们对it)
  • IronRuby,Ruby.NET无能为力:就像JRuby,XRuby,但是在CLI上,而不是在JVM

另请参见my answer to another similar question about Ruby。(请注意,这个答案已经有一年多了,其中一些已经不再准确了。例如,Rubinius现在使用真正的并发原生线程,而不是真正的并发绿色线程。此外,从那时起,出现了几个新的Ruby实现,例如BlueRuby、tinyrb、Ruby Go Lightly、Red Sun和SmallRuby。)

与Python类似:

Python :原生线程,没有真正的multithreading

  • PyPy:原生线程,取决于执行引擎(PyPy可以原生运行,也可以在

  • 上运行,也可以在CPython上运行,也可以在另一个执行引擎上运行。每当底层平台支持真正的多线程时,JVM都会支持,too.)
  • Unladen吞噬:本机线程,目前没有真正的多线程,但修复是planned
  • Jython: JVM线程,请参见JRuby
  • IronPython: PyPy线程,请参见IronRuby

对于Haskell来说,至少Glasgow Haskell编译器支持本机线程的真正多线程。我不知道UHC,LHC,JHC,YHC,HUGS或所有其他的。

对于Erlang,BEAM和HiPE都支持使用绿色线程的真正多线程。

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

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

票数 34
EN

Stack Overflow用户

发布于 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

票数 22
EN

Stack Overflow用户

发布于 2009-12-17 19:00:29

如果使用-threaded选项编译,然后在运行时传递+RTS -N<x> -RTS (其中<x> =所需的OS线程数),那么GHC编译器将在多个OS线程(从而多个内核)上运行您的程序。

票数 16
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1920805

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档