Scala 和 Erlang 是不是使用绿色线程?

Posted

技术标签:

【中文标题】Scala 和 Erlang 是不是使用绿色线程?【英文标题】:Do Scala and Erlang use green threads?Scala 和 Erlang 是否使用绿色线程? 【发布时间】:2011-02-03 17:43:06 【问题描述】:

我已经阅读了很多关于 Scala 和 Erlang 如何处理轻量级线程及其并发模型(参与者)的文章。

但是,我有疑问。

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

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

在幕后,这到底是如何工作的?

【问题讨论】:

Java 十年来根本没有使用过绿色线程 【参考方案1】:

Scala 使用底层 Java 线程实现,uses native threads。

不能说 Erlang。

【讨论】:

嗨,戴夫,我知道,最新的 JVM 只使用本机线程,但 Scala 仅使用本机线程可扩展存在问题。所以,我读过的一些文章说线程池(workers)用于Scala“并发环境”,而想法是使用不太可能的java线程(本机线程)。 早期的 Akka(基于 Scala 的 actor 库)使用 HawtDispatch (hawtdispatch.fusesource.org)。但与此同时,它们已经变成了别的东西。我不知道那是什么。如果您有兴趣,可以在 Akka 论坛 (akka.io) 上询问他们【参考方案2】:

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

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

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

进一步阅读

http://www.erlang.org/pipermail/erlang-questions/2008-September/038231.html http://erlang.org/euc/08/euc_smp.pdf

【讨论】:

@谢谢克里斯蒂安。所以用户空间多任务调度器会选择一些“线程对象”由操作系统线程执行。对吗? 我无法比我链接到的 EUC'08 的 pdf 更好地描述它。我相信当前的 OTP 版本现在有多个运行队列,如第 5.2 节所述,我们生活在未来。 不,操作系统线程运行一个 erlang 调度程序,该调度程序显式处理进程及其调度。这就是为什么每个核心很少有超过一个线程的原因,至少对于运行 erlang 代码来说,它是不需要的。用于 erlang 进程的操作系统线程通常过于繁重。【参考方案3】:

有关 Erlang 实现细节的最新信息,请查看fresh talk (slides)。

【讨论】:

【参考方案4】:

Scala 2.8 使用 Java 线程池。轻量级actor (Reactor) 和轻量级模式下的较重actor (react ...) 不占用自己的线程;相反,当他们有消息时,他们会占用一个线程,直到他们处理完消息,然后返回线程并且在下一条消息命中之前根本不运行。

This article 对 2.7 中的 Actor 给出了不错的描述; 2.8 并没有什么不同。

【讨论】:

@Rex,但是,为了可扩展,scala 不能只使用 java 线程(本机 OS 线程),它必须能够创建一种新线程可用的环境,比如绿色线程.想象一下,100 个参与者,每个参与者使用一个 java 线程,这不是轻量级线程,因为切换线程上下文不是太轻量级。对吗? 那是正确的。这些开关不像 Erlang 那样轻量级。您几乎总是可以避免在 100 个线程上使用 100 个参与者(通过让它们对消息做出反应而不是不断运行),因此您仍然拥有支持整个事件的非轻量级 Java 线程,但更轻量级的消息消耗(因为多个消息演员可以由一个线程处理)。由于这种架构,您可以在不耗尽操作系统线程的情况下扩展到非常多的 react-style actor,但它不像 Erlang 那样具有惊人的可扩展性。 (搜索“线程环基准测试”...) @CHAPa Akka actor 基于回调,因此不需要多个线程。从开发的角度来看,这种模型要差得多,但允许在仅提供线程池的平台上使用它。

以上是关于Scala 和 Erlang 是不是使用绿色线程?的主要内容,如果未能解决你的问题,请参考以下文章

Scala教程 网盘下载

绿色线程与非绿色线程

erlang如何使用一个OS线程实现抢占式调度?

Erlang timer:sleep(1000) 导致线程死机

Erlang 线程的内存监控工具

Erlang运行时中的原子操作