akka/erlang的actor模型與go語言的協程goroutine與通道channel代表的csp(communicating sequential processes)模型有什麼區別呢?
首先這兩者都是併發模型的解決方案,我們看看actor和channel這兩個方案的不同:
actor模型
在actor模型中,主角是actor,類似一種worker,actor彼此之間直接傳送訊息,不需要經過什麼中介,訊息是非同步傳送和處理的:
actor模型描述了一組為了避免併發程式設計的常見問題的公理:
1.所有actor狀態是actor本地的,外部無法訪問。
2.actor必須只有通過訊息傳遞進行通訊。
3.乙個actor可以響應訊息:推出新actor,改變其內部狀態,或將訊息傳送到乙個或多個其他參與者。
4.actor可能會堵塞自己,但actor不應該堵塞它執行的執行緒。
更多可見actor模型專題
channel模型中,worker之間不直接彼此聯絡,而是通過不同channel進行訊息發布和偵聽。訊息的傳送者和接收者之間通過channel松耦合,傳送者不知道自己訊息被哪個接收者消費了,接收者也不知道是哪個傳送者傳送的訊息。
go語言的csp模型是由協程goroutine與通道channel實現:
actor模型和csp區別圖如下:
actor之間直接通訊,而csp是通過channel通訊,在耦合度上兩者是有區別的,後者更加松耦合。
同時,它們都是描述獨立的流程通過訊息傳遞進行通訊。主要的區別在於:在csp訊息交換是同步的(即兩個流程的執行"接觸點"的,在此他們交換訊息),而actor模型是完全解耦的,可以在任意的時間將訊息傳送給任何未經證實的接受者。由於actor享有更大的相互獨立,因為他可以根據自己的狀態選擇處理哪個傳入訊息。自主性更大些。
在go語言中為了不堵塞流程,程式設計師必須檢查不同的傳入訊息,以便預見確保正確的順序。csp好處是channel不需要緩衝訊息,而actor理論上需要乙個無限大小的郵箱作為訊息緩衝。
Actor模型和CSP模型的區別
引用至 akka erlang的actor模型與go語言的協程goroutine與通道channel代表的csp communicating sequential processes 模型有什麼區別呢?首先這兩者都是併發模型的解決方案,我們看看actor和channel這兩個方案的不同 actor模...
Actor模型原理
scala actor執行緒模型可以這樣理解 所有actor共享乙個執行緒池,總的執行緒個數可以配置,也可以根據cpu個數決定 當乙個actor啟動之後,scala分配乙個執行緒給它使用,如果使用receive模型,這個執行緒就一直為該actor所有,如果使用react模型,scala執行完reac...
Actor模型的本質
actor模型的本質已經被強調了無數遍 萬物皆actor。actor之間只有傳送訊息這一種通訊方式,例如,無論是管理員讓工作者幹活,還是工作者把成果交還給管理員,它們之間也要通過傳送訊息的方式來傳遞資訊。這麼做看似不如直接方法呼叫來的直接,但是由於大量的訊息可以同時執行。同樣,訊息讓actor之間解...