Akka 如何决定哪个 Actor 获得线程?
Posted
技术标签:
【中文标题】Akka 如何决定哪个 Actor 获得线程?【英文标题】:How does Akka decide which Actor gets the Thread? 【发布时间】:2013-12-19 11:19:14 【问题描述】:假设我们有三个 Akka Actor
s、A
、B
和 C
在只有一个 Thread
的调度程序上运行,然后会发生以下情况:
A
收到一条消息并开始处理它
与此同时,一条消息被发送到B
,同时一条消息被发送到C
。由于没有可用的Thread
s,B
和C
都将这些邮件放入他们的邮箱中
A
现在完成了对它的消息的处理并且其邮箱中没有更多消息,因此将Thread
释放回池中
B
或 C
现在都需要这个 Thread
。是否有任何保证将首先放在线程上?
Akka 如何做出这个决定?是否对ActorSystem
中的所有Actor
s 进行循环? 此决定是否可配置? 在这些情况下,我可以说优先Actor
C
在Actor
B
之前获取线程吗?
【问题讨论】:
AFAIK 一个 Akka Actor 不会消耗处于“等待处理消息”状态的线程。线程应该在接收到消息时被 Actor 拾取(当然吞吐量和吞吐量截止时间也可能很重要)。所以,收到一条消息 - 拿起一个线程。 AFAIK 这个决定是不可配置的。 编辑了问题以澄清。两个 Actor 等待接收消息。两者都需要一个线程,但只有一个可用。哪一个会挑线?假设 dispatcher.throughput 配置为 1,dispatcher.throughput-deadline-time 配置为 0 ms。 如果两个邮箱都是空的 - 踏板将由首先收到消息的 Actor(由 Dispatcher 提供)拾取。如果两个邮箱都不是空的 - Actors(由 Dispatcher 提供给他们)将根据吞吐量和吞吐量-截止时间 - 在您的示例中每个 Actor 应该处理一条消息,然后线程应该是传递给另一个 Actor(如果另一个 Actor 有消息要处理)。 是的,但这并不能回答我的问题。如果两个Actor
s 需要Thread
,因为他们的邮箱中有一条消息,但只有一个Thread
可用,那么Akka 必须决定哪个Actor
将首先获得Thread
。我的问题是这个决定的依据是什么?
:) 如果两个 Actor 在他们的邮箱中都有一条消息,那么一个线程应该已经很忙 - 由其中一个接收消息进行消息处理(谁将首先收到消息将首先接收一个线程)。之后,Actor 应该在每个线程获取中处理 1 条消息(基于吞吐量 = 1)。
【参考方案1】:
使用 Akka 的全部原因是不必处理这类事情。您不希望(或不需要)以这样的方式优先考虑演员。内部调度程序逻辑很复杂,并且经过很好的优化,可以尽可能快地处理任务。应该通过其他方式确定优先级 - 例如路由器或优先邮箱。
现在回答您的问题:默认调度程序由阻塞队列支持 - 首先在其邮箱中收到消息的参与者将被首先选择。
【讨论】:
以上是关于Akka 如何决定哪个 Actor 获得线程?的主要内容,如果未能解决你的问题,请参考以下文章