Akka 如何决定哪个 Actor 获得线程?

Posted

技术标签:

【中文标题】Akka 如何决定哪个 Actor 获得线程?【英文标题】:How does Akka decide which Actor gets the Thread? 【发布时间】:2013-12-19 11:19:14 【问题描述】:

假设我们有三个 Akka Actors、ABC 在只有一个 Thread 的调度程序上运行,然后会发生以下情况:

    A 收到一条消息并开始处理它 与此同时,一条消息被发送到B,同时一条消息被发送到C。由于没有可用的Threads,BC 都将这些邮件放入他们的邮箱中 A 现在完成了对它的消息的处理并且其邮箱中没有更多消息,因此将Thread 释放回池中 BC 现在都需要这个 Thread。是否有任何保证将首先放在线程上?
Akka 如何做出这个决定?是否对ActorSystem 中的所有Actors 进行循环? 此决定是否可配置? 在这些情况下,我可以说优先 Actor CActor B 之前获取线程吗?

【问题讨论】:

AFAIK 一个 Akka Actor 不会消耗处于“等待处理消息”状态的线程。线程应该在接收到消息时被 Actor 拾取(当然吞吐量和吞吐量截止时间也可能很重要)。所以,收到一条消息 - 拿起一个线程。 AFAIK 这个决定是不可配置的。 编辑了问题以澄清。两个 Actor 等待接收消息。两者都需要一个线程,但只有一个可用。哪一个会挑线?假设 dispatcher.throughput 配置为 1,dispatcher.throughput-deadline-time 配置为 0 ms。 如果两个邮箱都是空的 - 踏板将由首先收到消息的 Actor(由 Dispatcher 提供)拾取。如果两个邮箱都不是空的 - Actors(由 Dispatcher 提供给他们)将根据吞吐量和吞吐量-截止时间 - 在您的示例中每个 Actor 应该处理一条消息,然后线程应该是传递给另一个 Actor(如果另一个 Actor 有消息要处理)。 是的,但这并不能回答我的问题。如果两个Actors 需要Thread,因为他们的邮箱中有一条消息,但只有一个Thread 可用,那么Akka 必须决定哪个Actor 将首先获得Thread。我的问题是这个决定的依据是什么? :) 如果两个 Actor 在他们的邮箱中都有一条消息,那么一个线程应该已经很忙 - 由其中一个接收消息进行消息处理(谁将首先收到消息将首先接收一个线程)。之后,Actor 应该在每个线程获取中处理 1 条消息(基于吞吐量 = 1)。 【参考方案1】:

使用 Akka 的全部原因是不必处理这类事情。您不希望(或不需要)以这样的方式优先考虑演员。内部调度程序逻辑很复杂,并且经过很好的优化,可以尽可能快地处理任务。应该通过其他方式确定优先级 - 例如路由器或优先邮箱。

现在回答您的问题:默认调度程序由阻塞队列支持 - 首先在其邮箱中收到消息的参与者将被首先选择。

【讨论】:

以上是关于Akka 如何决定哪个 Actor 获得线程?的主要内容,如果未能解决你的问题,请参考以下文章

Scala笔记整理:Actor和AKKA

akka actor初探

与 Scala / Akka Actor 相比,Java 线程有多重?

Actor模型-Akka

二 Akka学习 - actor介绍

scala学习笔记-Actor(19)