【发布时间】:2023-03-11 14:44:01
【问题描述】:
假设我们有三个 Akka Actors、A、B 和 C 在只有一个 Thread 的调度程序上运行,然后会发生以下情况:
-
A收到一条消息并开始处理它 - 与此同时,一条消息被发送到
B,同时一条消息被发送到C。由于没有可用的Threads,B和C都将这些邮件放入他们的邮箱中 -
A现在完成了对它的消息的处理并且其邮箱中没有更多消息,因此将Thread释放回池中 -
B或C现在都需要这个Thread。是否有任何保证将首先放在线程上?
- Akka 如何做出这个决定?是否对
ActorSystem中的所有Actors 进行循环?- 此决定是否可配置?
- 在这些情况下,我可以说优先
ActorC在ActorB之前获取线程吗?
【问题讨论】:
-
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)。