我一直在阅读很多关于Scala和Erlang如何处理轻量级线程及其并发模型(actor)的内容。
然而,我有疑虑。
Scala和Erlang是否使用类似于Java(绿色线程)使用的旧线程模型的方法?
例如,假设有一台具有2个内核的计算机,那么Scala / Erlang环境将为每个处理器分叉一个线程?其他线程将由用户空间(Scala VM / Erlang VM)环境调度。这是对的吗?
在幕后,这是如何运作的?
答案 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 talk(slides)。
答案 3 :(得分:2)
Scala使用底层Java线程实现,uses native threads。
不能说Erlang。