如何在基础线程上实现Akka actor?

问题描述 投票:14回答:4

给出执行上下文和线程池,如何在其上调度/实现akka / scala actor?

multithreading scala akka actor
4个回答
24
投票

我很长时间以来一直对此主题感到困惑。我假设线程和参与者之间存在某种关系。每个演员都有一个主持它的线程,所以我在想。在协作多任务模式下工作的每个线程可能都有几个参与者。

文档着重于用法,并简要介绍了内部体系结构。您只需要扩展Actor类,您就可以成为演员。所以我试图猜测如何做到这一点。并想象每个Actor都有生命周期。诸如异步等待消息队列之类的东西。然后处理消息。开始。

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

为了使生活充满灵感,需要涉及一群真正的工人的协调工作。它的核心是dispatcher。它包含所有参与者,线程和消息。当资源可用并且有消息可用于处理时,dispatcher会激活。它使用适当的Actor对象,将其receive方法包装在runnable中,并将其传递给备用线程。因此,仅从actor系统偶尔调用方法就没有对象的生命周期。

[当您想到它时,它比我早先设想的方案更有意义。但是我很难从可用的文档中推断出它。它是由经验丰富的并发程序员编写的。区分actor类和它后面的actor概念的区别。他们知道actor系统的dispatcher就像OS的任务调度程序。因此,他们很快地找到了要点,并描述了各种口味,并且实现了大家都熟悉的概念。

但是对于新手来说,这并不容易。他不了解演员系统环境中的dispatcher pattern。我试图用Google搜索“调度程序模式”,它显示出仅与参与者系统定义无关。

我很容易找到double dispatch,多调度和其他OOP主题。我发现了与akka的路由器message dispatcher类似的东西。演员消息分发程序可能有不错的描述,但很难找到。

我希望我消除了误会。


5
投票

关于'我正在研究一个更像是说给您10个线程的线程池,并从中分离出50个actor,一批10个线程如何处理这么多actor?'

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

  • 选择一个具有非空邮箱的演员
  • 然后将那个“演员”分派到执行者上运行
  • 邮件出队和处理的地方。
    • [在可能的情况下,一些消息出队并接连处理
    • [处理了一些消息(或没有消息)后,将选择另一个参与者,以防止饥饿。 (throughput parameter
  • 重复出现

2
投票

您可以在akka documentation中找到相关信息,就目前情况而言,它是相当完整的。

基本上,您可以选择/定义调度程序,并通过配置(通过文件或代码)将角色分配给它们。

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


0
投票

我在寻找演员如何获得线程之后去了[https://medium.com/@arcagarwal/introduction-to-akka-actors-5ec3ff032f4b],希望这会有所帮助!

© www.soinside.com 2019 - 2024. All rights reserved.