Actor模型和CSP模型的區別

Actor模型和CSP模型的區別

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

  首先這二者都是併發模型的解決方案,咱們看看Actor和Channel這兩個方案的不一樣:程序員

Actor模型

  在Actor模型中,主角是Actor,相似一種worker,Actor彼此之間直接發送消息,不須要通過什麼中介,消息是異步發送和處理的:編程

actor模型

  Actor模型描述了一組爲了不併發編程的常見問題的公理:併發

  1.全部Actor狀態是Actor本地的,外部沒法訪問。
  2.Actor必須只有經過消息傳遞進行通訊。  
  3.一個Actor能夠響應消息:推出新Actor,改變其內部狀態,或將消息發送到一個或多個其餘參與者。
  4.Actor可能會堵塞本身,但Actor不該該堵塞它運行的線程。異步

  更多可見Actor模型專題操作系統

 

Channel模型

  Channel模型中,worker之間不直接彼此聯繫,而是經過不一樣channel進行消息發佈和偵聽。消息的發送者和接收者之間經過Channel鬆耦合,發送者不知道本身消息被哪一個接收者消費了,接收者也不知道是哪一個發送者發送的消息。線程

channel模型

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

  • Go協程goroutine: 是一種輕量線程,它不是操做系統的線程,而是將一個操做系統線程分段使用,經過調度器實現協做式調度。是一種綠色線程,微線程,它與Coroutine協程也有區別,可以在發現堵塞後啓動新的微線程。
  • 通道channel: 相似Unix的Pipe,用於協程之間通信和同步。協程之間雖然解耦,可是它們和Channel有着耦合。

 

Actor模型和CSP區別

  Actor模型和CSP區別圖以下:協程

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

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

  在Go語言中爲了避免堵塞流程,程序員必須檢查不一樣的傳入消息,以便預見確保正確的順序。CSP好處是Channel不須要緩衝消息,而Actor理論上須要一個無限大小的郵箱做爲消息緩衝。

 

https://www.jdon.com/concurrent/actor-csp.html

相關文章
相關標籤/搜索