我一直在阅读关于Scala和Erlang如何使用轻量级线程和并发模型(actors)的文章。
但是,我还有些疑问。
Scala和Erlang是否采用与Java旧版线程模型(绿色线程)类似的方法?
例如,假设有一台拥有2个核心的机器,那么Scala/Erlang环境将为每个处理器分配一个线程吗?其他线程将由用户空间(Scala VM / Erlang VM)环境进行调度。这样正确吗?
在底层,这实际上是如何工作的?
我一直在阅读关于Scala和Erlang如何使用轻量级线程和并发模型(actors)的文章。
但是,我还有些疑问。
Scala和Erlang是否采用与Java旧版线程模型(绿色线程)类似的方法?
例如,假设有一台拥有2个核心的机器,那么Scala/Erlang环境将为每个处理器分配一个线程吗?其他线程将由用户空间(Scala VM / Erlang VM)环境进行调度。这样正确吗?
在底层,这实际上是如何工作的?
Erlang使用用户空间多任务处理,任务运行直到它们被阻塞或者使用完它们的“reductions”份额。一个reduction模糊定义为一次计算的单元。
在SMP调度器之前,只有一个内核线程处理可运行任务。通过SMP调度,您可以使用多个内核线程来处理任务,从而在多核机器上并行执行代码。调度线程的数量应该与核心数相匹配。请参阅erl manpage中的-smp [enable|auto|disable]
开关。
还有用于执行阻塞系统调用的可加载驱动程序的内核线程池。这称为异步线程池。请参阅erl manpage中的+A size
。
进一步阅读
Scala 2.8使用Java线程池。轻量级的演员(Reactor)和轻量级模式下的较重的演员(react {...})不会占用自己的线程;相反,当它们有消息时,它们会占用一个线程直到完成处理该消息,然后归还线程并且在下一条消息到来前不运行。
这篇文章描述了2.7版本的演员(Actors)并且对2.8版本也有帮助。
Scala使用底层的Java线程实现,使用本地线程。
对于Erlang我无法评论。