与 Scala / Akka Actor 相比,Java 线程有多重?

Posted

技术标签:

【中文标题】与 Scala / Akka Actor 相比,Java 线程有多重?【英文标题】:How are Java threads heavy compared to Scala / Akka actors? 【发布时间】:2013-03-11 08:04:39 【问题描述】:

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

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

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

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

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

谢谢。

【问题讨论】:

至于您的网络服务器问题,这取决于您的需要。确实有一些基于 NIO 的高吞吐量可扩展解决方案,例如 Netty,而且它们不使用演员。你需要一个成熟的网络服务器吗?高流量服务?与已知框架(jee、spring...)的高度集成?一般的演员,特别是 Akka 2.1 支持集群,或播放!它基于 akka,也是一个“可扩展”的解决方案,但没有适用于所有场景的灵丹妙药。这真的取决于您的需求。 【参考方案1】:

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

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

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

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

【讨论】:

我不确定文档是否支持您所写的内容,因为他们说“...通常许多演员共享一个线程”。 @Suma - 我不认为你理解我的第二段。【参考方案2】:

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

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

【讨论】:

以上是关于与 Scala / Akka Actor 相比,Java 线程有多重?的主要内容,如果未能解决你的问题,请参考以下文章

Scala笔记整理:Actor和AKKA

Scala笔记整理:Actor和AKKA

Scala实现Akka的并发与分布式

[scala] akka actor编程

Scala并发框架Akka原理详解

Scala零基础教学90-101Akka 实战-深入解析