与Scala / Akka actor相比,Java线程的重量如何?

2022-08-31 22:36:01

我只是比较了 scala actor 与 java 线程的性能。

我很惊讶地看到了这种差异,我观察到,在我的系统中,我最多只能生成~2000个线程(一次实时),但是使用相同的系统,我能够生成~500,000个scala的演员。

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

你能解释一下Java线程比scala / akka演员的重量要重得多吗?是什么让 Scala-actor 如此轻盈的关键因素是什么?

如果我想实现最佳的可扩展性,我应该选择基于actor的Web服务器,而不是像JBoss或Tomcat这样基于Java的传统Web/app服务器吗?

谢谢。


答案 1

Scala actor(包括Akka变种)使用Java线程。这并不神奇:对于大多数台式计算机来说,同时运行的线程超过几千个是一个问题。

Actor 模型允许按需唤醒的 Actor,除非他们有工作要做,否则它们不会占用线程。有些问题可以有效地建模为许多睡眠代理等待获得一些工作,他们会相对较快地完成,然后回到睡眠状态。在这种情况下,actor是使用Java线程完成工作的一种非常有效的方法,特别是如果你有一个像Akka这样的库,其中性能一直是高优先级的。

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

所有合理可扩展的Web服务器都必须以某种方式解决此类问题;您可能不应该主要根据是否在引擎盖下使用Actor来决定Web服务器,并且无论您使用什么,您都可以自己添加Actor。


答案 2

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

当消息被分派给执行组件时,该执行组件被放置在线程池上以处理该消息。完成后,池化线程可用于执行其他参与者。


推荐