48

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

我很惊讶地看到差异,我观察到使用我的系统我最多只能生成约 2000 个线程(一次运行)但使用相同的系统我能够生成约 500,000 个 scala 演员。

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

你能解释一下 java 线程是如何比 scala / akka 演员重这么多的吗?让 scala-actor 如此轻巧的关键因素是什么?

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

谢谢。

4

2 回答 2

39

Scala actor(包括 Akka 变种)使用 Java 线程。没有什么神奇的:同时运行几千个线程对于大多数台式机来说是个问题。

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

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

所有可合理扩展的 Web 服务器都必须以一种或另一种方式解决这类问题;您可能不应该主要根据是否在幕后使用演员来决定网络服务器,并且无论您使用什么,您都可以自己添加演员。

于 2013-03-21T17:27:16.707 回答
20

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

当消息被分派给一个actor时,那个actor被放置在一个线程池中来处理这个消息。完成后,池化线程可用于执行其他参与者。

于 2013-03-21T17:26:54.223 回答