Java线程与Scala/Akka actors相比,哪个更加耗费资源?

49

我刚刚比较了scala actors和java线程的性能。

我惊讶地发现它们之间的差异,我观察到我的系统只能最多同时生成约 2000 个线程,但是使用相同的系统,我却能够生成大约 500,000 个scala actor。

这两个程序都使用了JVM堆内存的约81MB。

您能解释一下为什么java线程比scala/akka actors重量级吗?是什么关键因素使得Scala-actor如此轻量级?

如果我想获得最佳可扩展性,是应该选择基于actor的Web服务器还是传统的基于Java的Web/app服务器(如JBoss或Tomcat)?

谢谢。


3
关于您的Web服务器问题,这取决于您的需求。对于高吞吐量基于NIO的可扩展解决方案,如Netty,并且它们不使用演员模型。您需要一个完整的Web服务器?高流量服务?与已知框架(JEE,Spring等)高度集成?一般来说,支持集群的演员模型,特别是Akka 2.1或基于Akka的play!也是一种“可扩展”的解决方案,但并非所有场景都有通用解决方案。真正取决于您的需求。 - pagoda_5b
2个回答

40
Scala actors(包括Akka)使用Java线程。这并不是什么魔法:对于大多数桌面机来说,同时运行超过几千个线程是一个问题。
Actor模型允许按需唤醒的演员,除非有工作要做,否则它们不会占用线程。某些问题可以有效地建模为许多正在等待获得一些工作的睡眠代理,他们将很快完成工作,然后回到睡眠状态。在这种情况下,演员是使用Java线程高效完成工作的一种方式,特别是如果您有像Akka这样的库,性能是优先考虑的。 Akka文档很好地解释了基本原理。
所有合理可伸缩的Web服务器都必须以某种方式解决这种问题;您可能不应该主要基于是否在幕后使用演员来决定Web服务器的选择,而无论您使用什么,都可以自己添加演员。

我不确定文档是否支持你所写的内容,因为它们说:“通常许多演员共享一个线程”。 - Suma
2
@Suma - 我认为你没有理解我的第二段话。 - Rex Kerr

20

一个Akka actor并不等同于一个线程。更像是在线程池上执行的Callable

当一条消息被分发到一个Actor时,该Actor会被放入线程池中处理该消息。处理完后,池中的线程可以被用来执行其他Actor。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接