Akka/Erlang的actor模型與Go語言的協程Goroutine與通道Channel表明的CSP(Communicating Sequential Processes)模型有什麼區別呢?html
首先這二者都是併發模型的解決方案,咱們看看Actor和Channel這兩個方案的不一樣:程序員
在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實現:3d
Actor模型和CSP區別圖以下:協程
Actor之間直接通信,而CSP是經過Channel通信,在耦合度上二者是有區別的,後者更加鬆耦合。htm
同時,它們都是描述獨立的流程經過消息傳遞進行通訊。主要的區別在於:在CSP消息交換是同步的(即兩個流程的執行"接觸點"的,在此他們交換消息),而Actor模型是徹底解耦的,能夠在任意的時間將消息發送給任何未經證明的接受者。因爲Actor享有更大的相互獨立,由於他能夠根據本身的狀態選擇處理哪一個傳入消息。自主性更大些。
在Go語言中爲了避免堵塞流程,程序員必須檢查不一樣的傳入消息,以便預見確保正確的順序。CSP好處是Channel不須要緩衝消息,而Actor理論上須要一個無限大小的郵箱做爲消息緩衝。
https://www.jdon.com/concurrent/actor-csp.html