Scala和Erlang使用绿色线程吗?

时间:2010-04-02 13:09:46

标签: multithreading scala erlang multicore

我一直在阅读很多关于Scala和Erlang如何处理轻量级线程及其并发模型(actor)的内容。

然而,我有疑虑。

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

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

在幕后,这是如何运作的?

4 个答案:

答案 0 :(得分:24)

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

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

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

进一步阅读

答案 1 :(得分:13)

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

This article在2.7中给出了很好的Actors描述; 2.8并没有那么不同。

答案 2 :(得分:4)

有关Erlang实施详细信息的最新信息,请查看fresh talkslides)。

答案 3 :(得分:2)

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

不能说Erlang。