我只是比较了scala参与者和java线程的性能。
我惊讶地发现了其中的不同之处,我观察到,使用我的系统,我只能产生最多~2000个线程(一次活动),但使用相同的系统,我可以产生大约500,000个scala参与者。
这两个程序都使用了大约81MB的JVM堆内存。
你能解释一下为什么java线程比scala / akka参与者更重吗?scala-actor如此轻量级的关键因素是什么?
如果我想实现最好的可伸缩性,我应该选择基于角色的web服务器,而不是基于java的传统web/应用服务器,如JBoss或Tomcat?
谢谢。
发布于 2013-03-22 01:27:17
Scala参与者(包括Akka类型)使用Java线程。没有什么神奇之处:超过几千个线程同时运行对于大多数台式机来说都是一个问题。
Actor模型允许按需唤醒Actor,这些Actor不占用线程,除非它们有工作要做。一些问题可以有效地模拟为许多休眠代理等待获得一些工作,这些代理将相对快速地完成工作,然后返回睡眠。在这种情况下,actors是使用Java线程化完成工作的一种非常有效的方法,特别是如果您有一个像Akka这样的库,其中性能一直是一个高优先级的库。
Akka docs很好地解释了基础知识。
所有具有合理伸缩性的web服务器都必须以某种方式来解决这类问题;您可能不应该将您对web服务器的决定主要基于是否在幕后使用角色,并且无论您使用什么,您都可以自己添加角色。
发布于 2013-03-22 01:26:54
Akka角色并不等同于线程。它更像是在线程池上执行的Callable
。
当消息被调度到执行元时,该执行元被放在线程池中以处理该消息。当它完成时,池化线程可以用来执行其他参与者。
https://stackoverflow.com/questions/15553857
复制相似问题