多线程-与Scala / Akka参与者相比,Java线程的负担如何?

我只是在比较Scala actor和Java线程的性能。

我惊讶地看到了两者之间的差异,我发现使用我的系统我最多只能产生约2000个线程(一次处于活动状态),但是使用同一系统,我可以产生约500,000个scala参与者。

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

您能解释一下java线程比scala / akka演员有多大的负担吗?是什么让scala-actor如此轻量级的关键因素是什么?

如果我想获得最佳的可伸缩性,是否应该选择基于actor的Web服务器,而不是像JBoss或Tomcat这样的基于Java的传统Web /应用服务器?

谢谢。

2个解决方案
39 votes

Scala演员(包括Akka演员)使用Java线程。 这没有魔术:大多数台式机都存在同时运行数千个线程的问题。

Actor模型允许按需唤醒的actor,除非他们有工作要做,否则它们不会占用线程。 可以通过许多睡眠代理人等待工作来有效地模拟一些问题,他们会相对快速地完成工作然后再入睡。 在这种情况下,参与者是使用Java线程完成工作的一种非常有效的方法,尤其是当您拥有Akka之类的库时,性能一直被放在首位。

Akka文档很好地解释了基础知识。

所有合理可扩展的Web服务器都必须以一种或另一种方式解决此类问题。 您可能不应该基于对Web服务器的决定主要基于是否在幕后使用actor,并且不管您使用什么,都可以自己添加actor。

Rex Kerr answered 2020-02-29T11:00:16Z
18 votes

Akka演员不等同于线程。 它更像是在线程池上执行的Callable

将消息分派给角色时,该角色将放置在线程池上以处理消息。 完成后,合并的线程可用于执行其他参与者。

parsifal answered 2020-02-29T11:00:41Z
translate from https://stackoverflow.com:/questions/15553857/how-are-java-threads-heavy-compared-to-scala-akka-actors