【发布时间】:2014-01-07 12:29:18
【问题描述】:
给定一个执行上下文和一个线程池,akka/scala actor 如何在其上调度/实现?
【问题讨论】:
-
akka 文档中已经包含了明确的解释。
标签: multithreading scala akka actor
给定一个执行上下文和一个线程池,akka/scala actor 如何在其上调度/实现?
【问题讨论】:
标签: multithreading scala akka actor
我对这个话题困惑了很长时间。我假设线程和参与者之间存在某种关系。对于每个演员,都有一个线程来承载它,所以我在想。每个线程可能有多个参与者在协作多任务模式下工作。
文档侧重于使用,并简单地涵盖了内部架构。你只需要扩展Actor 类,你就会得到一个工作演员。所以我试图猜测如何做到这一点,并想象每个Actor 都有生命周期,比如异步等待一个消息队列,然后处理消息然后开始。
这是一个完全错误的假设。尽管文档中说“演员生命周期”,但这并不意味着 Actor 生命周期。 Actor 提到的是一个概念,而不是实现Actor 类的实际对象。该对象被动地驻留在 Java 堆中。
要为这个概念注入活力,需要一群真正的工人进行协调工作。它的核心是一个dispatcher。它包含所有参与者、线程和消息。当资源变得可用并且有消息可用于处理时,dispatcher 激活。它采用适当的Actor 对象,将其接收方法包装在runnable 中,并将其传递给备用线程。因此对象没有生命周期,只有来自参与者系统的偶尔方法调用。
当你想到它时,它比我之前假设的方案更有意义。但是我很难从可用的文档中推断出它。它是由经验丰富的并发程序员编写的。将actor类与其背后的actor概念区分开来。他们知道,actor 系统的 dispatcher 就像操作系统的任务调度器。因此,他们很快就切入主题,描述了每个人都熟悉的概念的各种风格和实现。
但这对新手来说并不容易。他不熟悉参与者系统上下文中的调度程序模式。我尝试用谷歌搜索“调度程序模式”,它显示的定义与参与者系统无关。
我很容易找到double dispatch、多调度和其他 OOP 主题。我发现了类似于 Akka 的路由器 message dispatcher 的东西。演员消息调度程序可能有一个不错的描述,但并不容易找到。
我希望我已经消除了误解。
【讨论】:
关于“我正在研究的东西更像是说给你一个由 10 个线程组成的线程池,并从中分离出 50 个参与者,这么多参与者是如何由 10 个线程处理的?”
确切的行为取决于调度程序和配置。然而,大多数调度员基本上都是这样做的:
【讨论】:
您可以在akka documentation 中找到相关信息,就目前而言,该信息非常完整。
基本上,您可以选择/定义调度程序并通过配置(通过文件或代码)将参与者分配给它们。
每个调度器实现都基于某种执行器。
【讨论】: