如何在底层线程上实现akka actor?

时间:2013-12-19 04:00:45

标签: multithreading scala akka actor

鉴于执行上下文和线程池,akka / scala actor是如何安排/实现的?

3 个答案:

答案 0 :(得分:20)

很长一段时间我对这个话题很困惑。我假设线程和演员之间存在某种关系。每个演员都有一个主持它的线程,所以我在想。可能每个线程都有几个actor在协同多任务模式下工作。

文档侧重于使用并轻松覆盖内部架构。你应该扩展Actor类,你会得到工作的演员。所以我试着猜测如何做到这一点。并想象每个Actor都有生命周期。像消息队列异步等待的东西。然后处理消息。去开始。

这是完全错误的假设。虽然文档说“演员生命周期”但它并不意味着Actor生命周期。提到的 Actor 是一个概念,而不是实现Actor类的实际对象。该对象在java堆中处于被动状态。

要让生活融入到概念中,需要一批涉及真正的工人的协调工作。它的核心是调度员。它包含所有参与者,线程和消息。当资源可用且有可用于处理的消息时,调度程序将激活。它需要适当的Actor对象,将其receive方法包装在runnable中并将其传递给备用线程。因此,对象只有偶然的方法调用,没有生命周期。

当你想到它时,它比我早期假设的方案更有意义。但是我很难从可用的文档中推断出它。它是由经验丰富的并发程序员编写的。将actor类与 actor 概念背后的区分。他们知道演员系统的调度程序就像操作系统的任务调度程序一样。因此,他们很快就达到了目的,并描述了各种口味,并实现了每个人都熟悉的概念。

但这对新手来说并不容易。他在演员系统上下文中没有熟悉调度程序模式。我试图谷歌“调度员模式”,它只显示与演员系统定义无关。

我发现了轻松double dispatch,多调度和其他OOP主题。我找到了类似于akka的路由器message dispatcher的东西。对于演员消息调度员来说可能有不错的描述,但它并不容易找到。

我希望我已经清除了误解。

答案 1 :(得分:5)

On'我正在研究更多的事情,比如你给了一个10个线程的线程池和50个演员从中分离出来,如何通过一批10个线程处理这么多演员?'

确切的行为取决于调度程序和配置。但是,大多数调度员基本上都是这样的:

  • 选择具有非空邮箱的演员
  • 然后派遣“演员”在执行者身上运行
  • 消息被处理和处理的地方。
    • 如果可能的话,会有一些消息被逐一打印并进行处理
    • 在处理了一些消息(或没有留下任何消息)之后,挑选另一个演员,以防止饥饿。 (throughput parameter
  • 上升并重复

答案 2 :(得分:2)

您可以在akka documentation中找到相关信息,这一点非常完整。

基本上,您可以通过配置(通过文件或代码)选择/定义调度程序并为其分配actor。

然后,每个调度程序实现都基于某种执行程序。