正如上一篇所描述的那樣,通用編程實踐並不能恰當地知足要求現代系統的需求。謝天謝地,咱們不須要把咱們所知道的所有都廢棄了。相反,角色模型以必定原則方式解決這些缺點,讓系統可以以更好的方式與咱們的心智模式相匹配。角色模型抽象容許您從通訊方面考慮您的代碼,而不是像大型組織中的人之間發生的交換。html
角色模型容許咱們:編程
Actor不是調用方法,而是互相發送消息。發送消息不會將執行線程從發送方傳輸到目標,Actor能夠發送消息並繼續而不會阻止。所以,它能夠在相同的時間內完成更多。緩存
對於對象,當方法返回時,它釋放對其執行線程的控制。在這方面,actor的行爲與對象很是類似,它們在完成處理當前消息時對消息做出反應並返回執行。經過這種方式,Actor實際上實現了咱們想象的對象的執行:網絡
傳遞消息和調用方法之間的一個重要區別是消息沒有返回值。經過發送消息,Actor將工做委託給另外一個Actor。正如咱們在回調的錯覺中看到的那樣,若是它指望返回值,則發送方須要阻止或在同一線程上執行其餘Actor的工做。相反,接收者將結果傳遞給回覆消息。ide
咱們模型中須要的第二個關鍵變化是恢復封裝(reinstate encapsulation)。Actor對消息做出反應,就像對象「響應」它們上調用的方法同樣。不一樣之處在於,不是多個線程「響應」到咱們的Actor中而且對內部狀態和不變量形成嚴重破壞,Actor獨立於消息的發送者執行,而且他們一次一個地順序響應傳入的消息。當每一個Actor按順序處理髮送給它的消息時,不一樣的Actor會相互同時工做,這樣Actor系統就能夠同時處理硬件支持的消息。ui
因爲每一個actor最多隻能處理一條消息,所以能夠保持actor的不變量而不synchronization。這種在不使用鎖的狀況下使用:spa
總之,這是Actor收到消息時發生的事情:操作系統
爲了實現這種行爲,Actor有:線程
消息進入Actor郵箱。該角色的行爲描述了角色如何響應消息(好比發送更多消息和/或更改狀態)。執行環境將線程池從新設置爲徹底透明地驅動全部這些操做。htm
這是一個很是簡單的模型,它解決了之前列舉的問題:
因爲咱們再也不在發送消息的Actor之間擁有共享調用堆棧,所以咱們須要以不一樣方式處理錯誤狀況。咱們須要考慮兩種錯誤:
主管(父母)能夠決定在某些類型的故障中從新啓動其子actor,或者徹底阻止其餘人。孩子們永遠不會沉默地死去(除了進入無限循環以外),他們要麼失敗,要麼他們的父母能夠對錯誤做出反應,或者他們被中止(在這種狀況下,有關方會自動獲得通知)。老是有一個負責任的實體來管理一個演員:它的父母。從外部看不到從新啓動:協做actor能夠在目標actor從新啓動時繼續發送消息。
下一章,讓咱們簡要介紹一下Akka提供的功能。
原文:https://doc.akka.io/docs/akka/current/guide/actors-intro.html
有什麼討論的內容,能夠加我公衆號: