【问题标题】:How are akka actors implemented on underlying threads?akka actor 如何在底层线程上实现?
【发布时间】:2014-01-07 12:29:18
【问题描述】:

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

【问题讨论】:

  • akka 文档中已经包含了明确的解释。

标签: multithreading scala akka actor


【解决方案1】:

我对这个话题困惑了很长时间。我假设线程和参与者之间存在某种关系。对于每个演员,都有一个线程来承载它,所以我在想。每个线程可能有多个参与者在协作多任务模式下工作。

文档侧重于使用,并简单地涵盖了内部架构。你只需要扩展Actor 类,你就会得到一个工作演员。所以我试图猜测如何做到这一点,并想象每个Actor 都有生命周期,比如异步等待一个消息队列,然后处理消息然后开始。

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

要为这个概念注入活力,需要一群真正的工人进行协调工作。它的核心是一个dispatcher。它包含所有参与者、线程和消息。当资源变得可用并且有消息可用于处理时,dispatcher 激活。它采用适当的Actor 对象,将其接收方法包装在runnable 中,并将其传递给备用线程。因此对象没有生命周期,只有来自参与者系统的偶尔方法调用。

当你想到它时,它比我之前假设的方案更有意义。但是我很难从可用的文档中推断出它。它是由经验丰富的并发程序员编写的。将actor类与其背后的actor概念区分开来。他们知道,actor 系统的 dispatcher 就像操作系统的任务调度器。因此,他们很快就切入主题,描述了每个人都熟悉的概念的各种风格和实现。

但这对新手来说并不容易。他不熟悉参与者系统上下文中的调度程序模式。我尝试用谷歌搜索“调度程序模式”,它显示的定义与参与者系统无关。

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

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

【讨论】:

  • 感谢解释,我也有同样的经历
【解决方案2】:

关于“我正在研究的东西更像是说给你一个由 10 个线程组成的线程池,并从中分离出 50 个参与者,这么多参与者是如何由 10 个线程处理的?”

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

  • 选择邮箱非空的actor
  • 然后分派那个“演员”在执行器上运行
  • 消息在哪里出队和处理。
    • 如果可能,一些消息会被逐个出队并处理
    • 处理完一些消息(或没有消息)后,会选择另一个actor,以防止饥饿。 (throughput parameter)
  • 崛起并重复

【讨论】:

    【解决方案3】:

    您可以在akka documentation 中找到相关信息,就目前而言,该信息非常完整。

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

    每个调度器实现都基于某种执行器。

    【讨论】:

    • 感谢您的参考。我正在研究的东西更像是说你有一个由 10 个线程和 50 个演员组成的线程池,一批 10 个线程如何处理这么多演员?多看 ExecutorService 会有帮助吗?
    • 或许你可以在akka user list得到详细的答案
    猜你喜欢
    • 1970-01-01
    • 2016-04-07
    • 2017-04-02
    • 2023-03-11
    • 2015-09-09
    • 2023-04-03
    • 1970-01-01
    • 2015-02-23
    • 1970-01-01
    相关资源
    最近更新 更多