我对发送到演员邮箱的邮件有疑问。我知道演员有一个邮箱但不是它的一部分。邮箱由演员系统提供。
问题:
我有一个演员myAct在ID为10. myAct的线程上运行!给另一个演员yourAct的消息。是否有线程10将消息带到yourAct的邮箱,或者ActorSystem是否指定另一个线程将消息传递到邮箱。
答案 0 :(得分:2)
首先,要删除所有潜在的误导性事实:没有指定负责特定参与者的线程。因此,当你说I have an actor myAct running on thread with id 10
时 - 这可能是对的,但只是在那个特定的时间。
Akka官方文档中的片段:
幕后花絮Akka将在真实场景中运行多组演员 线程,通常许多actor共享一个线程,后续 一个演员的调用最终可能会被处理 线程。 Akka确保此实现细节不会影响 处理actor状态的单线程
其次,消息传递和处理是actor中的两种不同活动,最有可能发生在不同的线程上。
当您向演员发送消息时,您只是将其发送到其ActorRef,然后,它将联系调度员并使用它将消息排队到目标演员的邮箱。因此,从调用者的角度来看,唯一的阻塞就是将消息排入队列。之后,所有额外的工作和处理可能在一个单独的线程上完成。
我希望这很有帮助。
答案 1 :(得分:0)
Akka的dispatchers默认执行程序是fork-join-executor,它使用基于队列的work-stealing
算法。因此,我认为在演员的整个生命周期中,某个调度员不会成为某个任务的唯一所有者,我认为没有任何保证。
这个article描述了有关工作线程如何在fork-join框架中共享工作的一些细节。