2016-09-20 27 views
2

我不太清楚Akka系統中的路由器,調度器和執行器。如果我們沒有定義路由器,Akka Actor是否並行運行?

如果我沒有定義路由器,因此不給它一個組演員,演員是否並行運行?

如果我沒有定義的路由器,但定義和使用調度爲:

my-dispatcher { 
    type = Dispatcher 
    executor = "fork-join-executor" 
    fork-join-executor { 
    parallelism-min = 2 
    parallelism-factor = 2.0 
    parallelism-max = 10 
    } 
    throughput = 100 
} 

演員在並行運行或不?

回答

3

如果我不定義路由器,因此不給它一個組 演員,在平行演員運行或不?

調度員的演員系統是一個多ExecutionContext其中有螺紋的資產池是執行對演員的包裝。如果您創建的只是一個單個 actor,並將消息傳遞給它,則所有消息都將到達同一個演員郵箱,他將逐個處理。演員內部執行發生同步

如果您希望多個角色處理請求,那麼這正是路由器的用途。如果你想讓一組可以處理請求的角色相同,你可以分配一個路由器,它將爲你管理一組角色,並關心哪個角色獲得了哪些工作量。

一個例子是,當你有一個路由器,你定義角色的內部池,即RoundRobinPool它只是在一個循環方式分配消息演員郵箱:

context.actorOf(
    Props(new MyActor()) 
    .withRouter(RoundRobinPool(nrOfInstances = 10)), name = "MyRouter") 

這將創建一個Router與一個RoundRobinPool其中包含10個演員。

+0

由於處理它,但我需要知道更多。如果我創建一個路由器,說池大小爲10的'RoundRobinPool',並且設置'parallelism-max'爲8,那麼我會得到10或8個actor實例並行運行? –

+0

@Stephen您將獲得10個共享8個線程的線程池的actor。 –

+0

這意味着至多8個並行運行的實例,對吧? –

2

的消息爲什麼它說:「一個演員沒有演員」

當消息被髮送到演員的演員內串行執行

多數民衆贊成。它落在演員信箱內。郵件箱中的郵件以串行方式一個接一個地處理。這裏需要注意的一件重要的事情是,actor確保每個消息行爲在單個線程中執行,它可以是不同的線程。

所以路由器創建角色和路由信息的團體的演員組,以便每個演員同時並行的方式爲你的答案

+0

謝謝。我已經讀過「演員確保每個消息行爲在單個線程中執行多次可能是不同線程」,但我不明白爲什麼「可能是不同線程」的想法必須解決?它影響我們的應用程序嗎? –

+0

@Stephen ...演員是一個計算容器...這個容器可以自由選擇..任何閒置的線程來計算......這就是想法。想法是演員幫助廉價的對象,它可以工作任何系統中可用的任何線程。這非常重要,因爲......許多演員現在可以使用有限數量的線程完成工作 – pamu

相關問題