Scala和Erlang使用绿色线程吗?

CHA*_*APa 14 erlang multithreading scala multicore

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

但是,我有疑虑.

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

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

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

Chr*_*ian 24

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

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

还有一个内核线程池供可加载驱动程序执行阻塞系统调用.这称为异步线程池.见+A size该ERL手册页.

进一步阅读


Rex*_*err 13

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

本文对2.7中的Actors进行了不错的描述; 2.8没有那么不同.