鉴于执行上下文和线程池,akka / scala actor是如何安排/实现的?
答案 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个线程处理这么多演员?'
确切的行为取决于调度程序和配置。但是,大多数调度员基本上都是这样的:
答案 2 :(得分:2)
您可以在akka documentation中找到相关信息,这一点非常完整。
基本上,您可以通过配置(通过文件或代码)选择/定义调度程序并为其分配actor。
然后,每个调度程序实现都基于某种执行程序。