2010-04-02 102 views
13

我一直在阅读很多关于Scala和Erlang如何执行轻量级线程及其并发模型(actors)的内容。Scala和Erlang使用绿色线程吗?

但是,我有我的疑惑。

Scala和Erlang使用类似于Java(绿色线程)所使用的旧线程模型的方法吗?

例如,假设有一个2核的机器,那么Scala/Erlang环境会为每个处理器分配一个线程?其他线程将由用户空间(Scala VM/Erlang VM)环境进行调度。它是否正确?

在引擎盖下,这是如何工作的?

+0

Java十年来一直没有使用绿色线程 – vemv 2013-01-06 02:13:41

回答

23

Erlang正在使用用户空间多任务处理,任务一直运行到他们阻止或直到他们用完“减少”的份额。减少被模糊地定义为一个计算单位。

直到SMP调度程序,只有一个内核线程执行可运行的任务。通过SMP调度,您有几个内核线程执行任务,从而在多核机器上并行执行代码。调度程序线程的数量应该与核心数量相匹配。请参阅the erl manpage中的-smp [enable|auto|disable]开关。

还有一个内核线程池供可加载驱动程序执行阻塞系统调用。这称为异步线程池。请参见中的+A size

延伸阅读

+0

@thanks Christian。因此,用户空间多任务调度程序将选择一些由线程执行的“线程对象”。对 ? – CHAPa 2010-04-02 18:06:49

+0

我无法描述它比我链接到的EUC'08的pdf好得多。我相信目前的OTP版本现在有多个运行队列,如5.2节所述,我们将来会生活。 – Christian 2010-04-03 14:01:43

+0

不,操作系统线程运行显式处理进程及其调度的erlang调度程序。这就是为什么每个内核很少有多个线程的原因,至少在运行erlang代码时是不需要的。操作系统线程通常用于erlang进程。 – rvirding 2010-04-05 23:43:55

1

Scala使用底层的Java线程实现,其中uses native threads

不能说关于Erlang。

+0

hi dave, 我知道,最新的JVM只使用本地线程,但是scala只能使用本地线程进行扩展。所以,我读过的一些文章说,线程池(worker)用于Scala“并发环境”,而ideia使用的是较少可能的java线程(本地线程)。 – CHAPa 2010-04-02 13:24:05

+0

早期的Akka(基于Scala的演员库)使用HawtDispatch(http://hawtdispatch.fusesource.org/)。但他们在此期间改变了其他的东西。我不知道它是什么。如果你有兴趣,你可以在Akka论坛(akka.io)拨打他们 – OlliP 2014-04-30 14:00:51

4

有关Erlang的实现细节的最新信息检查fresh talkslides)。

+0

很酷,很好的谈话。谢谢 – CHAPa 2010-04-02 18:38:23

13

Scala 2.8使用Java线程池。轻量级演员(Reactor)和轻量级模式中​​较重的演员(react {...})不占用他们自己的线程;相反,当他们有消息的时候,他们需要一个线程,直到他们完成消息的处理,然后返回线程,直到下一个消息到达时才运行。

This article给出2.7的演员的体面的描述; 2.8没有那么不同。

+0

@Rex,但是为了扩展,scala不能使用java线程(native OS Thread),它必须能够创建一个新线程可用的环境,例如绿色线程。想象一下,100个演员,每个演员使用java线程,这不是轻量级的线程,因为切换线程上下文不是太轻。对 ? – CHAPa 2010-04-02 18:02:06

+0

这是正确的。这些交换机不像Erlang那么轻巧。几乎总是可以避免100个线程上有100个角色(通过让他们对消息作出反应而不是不断运行),所以您仍然拥有支持整个事务的非轻量级Java线程,但重量更轻的消息消耗(因为多个消息演员可以由一个线程处理)。由于这种架构,您可以扩展到很多反应式角色,而不会耗尽操作系统线程,但它不像Erlang那样具有惊人的可扩展性。 (搜索“线程环基准枪战”...) – 2010-04-02 19:06:23

+0

@CHAPa Akka演员基于回调,因此不需要多个线程。这种模式远远不如开发角度,但允许在仅提供线程池的平台上使用它。 – rightfold 2015-07-13 18:01:51