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