1. 程式人生 > >Actor模型和CSP模型的區別

Actor模型和CSP模型的區別

  Akka/Erlang的actor模型與Go語言的協程Goroutine與通道Channel代表的CSP(Communicating Sequential Processes)模型有什麼區別呢?

  首先這兩者都是併發模型的解決方案,我們看看Actor和Channel這兩個方案的不同:

Actor模型

  在Actor模型中,主角是Actor,類似一種worker,Actor彼此之間直接傳送訊息,不需要經過什麼中介,訊息是非同步傳送和處理的:

actor模型

  Actor模型描述了一組為了避免併發程式設計的常見問題的公理:

  1.所有Actor狀態是Actor本地的,外部無法訪問。
  2.Actor必須只有通過訊息傳遞進行通訊。  
  3.一個Actor可以響應訊息:推出新Actor,改變其內部狀態,或將訊息傳送到一個或多個其他參與者。
  4.Actor可能會堵塞自己,但Actor不應該堵塞它執行的執行緒。

 

Channel模型

  Channel模型中,worker之間不直接彼此聯絡,而是通過不同channel進行訊息釋出和偵聽。訊息的傳送者和接收者之間通過Channel鬆耦合,傳送者不知道自己訊息被哪個接收者消費了,接收者也不知道是哪個傳送者傳送的訊息。

channel模型

  Go語言的CSP模型是由協程Goroutine與通道Channel實現:

  • Go協程goroutine: 是一種輕量執行緒,它不是作業系統的執行緒,而是將一個作業系統執行緒分段使用,通過排程器實現協作式排程。是一種綠色執行緒,微執行緒,它與Coroutine協程也有區別,能夠在發現堵塞後啟動新的微執行緒。
  • 通道channel: 類似Unix的Pipe,用於協程之間通訊和同步。協程之間雖然解耦,但是它們和Channel有著耦合。

 

Actor模型和CSP區別

  Actor模型和CSP區別圖如下:

  Actor之間直接通訊,而CSP是通過Channel通訊,在耦合度上兩者是有區別的,後者更加鬆耦合。

  同時,它們都是描述獨立的流程通過訊息傳遞進行通訊。主要的區別在於:在CSP訊息交換是同步的(即兩個流程的執行"接觸點"的,在此他們交換訊息),而Actor模型是完全解耦的,可以在任意的時間將訊息傳送給任何未經證實的接受者。由於Actor享有更大的相互獨立,因為他可以根據自己的狀態選擇處理哪個傳入訊息。自主性更大些。

  在Go語言中為了不堵塞流程,程式設計師必須檢查不同的傳入訊息,以便預見確保正確的順序。CSP好處是Channel不需要緩衝訊息,而Actor理論上需要一個無限大小的郵箱作為訊息緩衝。