2017-04-04 24 views
0

我對發送給演員郵箱的郵件有疑問。我知道演員有一個郵箱,但不是它的一部分。郵箱由演員系統提供。參與者和郵箱 - 誰發送郵件?

問題:

我有一個演員myAct ID爲10 myAct上線運行了!給另一個演員的消息yourAct。線程10的責任是將消息帶到yourAct的郵箱中,還是由ActorSystem分配另一個線程來將郵件傳遞到郵箱。

回答

0

Akka的dispatchers的默認執行程序是fork-join-executor,它採用基於隊列的work-stealing算法。所以,我認爲沒有任何保證,給定的調度員將在演員的整個生命週期中成爲某個任務的唯一擁有者。

article描述了一些關於工作線程如何在fork-join框架中共享工作的細節。

2

首先,要刪除所有可能的誤導性事實:沒有任何線程被指定爲負責特定演員。因此,當你說I have an actor myAct running on thread with id 10 - 這可能是正確的,但只在特定的時間。

幕後阿卡將在臺真正 線程,其中通常很多演員共用一個線程,隨後 調用一個演員可能最終的運行臺演員:

從阿卡官方文檔片段正在處理不同的 線程。阿卡確保了此實現細節並不影響 處理演員的狀態

其次單threadedness,消息傳遞處理是一個演員在兩個不同的活動,這是最有可能發生在不同的線程。

當你給一個演員發送一條消息時,你只是將它發送給它的ActorRef,然後它將聯繫調度器並使用它將消息排隊到目標演員的郵箱上。因此,從調用者的角度來看,唯一的阻塞是排隊消息的行爲。之後,所有額外的工作和處理都可以在單獨的線程上完成。

我希望這是有幫助的。