golang 與 erlang 的比較

csp模型 vs actor模型

Gopher is cute
Caesar's study review on Web development
3 min readApr 18, 2019

--

兩種模型不同處 from Ref 3

最近在電話面試中被問了這個問題,詢問我對於這兩個語言的訊息傳遞我有什麼樣的看法,之前沒接觸過erlang,花了一點時間找資料,現在來整理一下自己的想法。

csp模型示意圖 from Ref 3

golang是基於csp的模型,重視channel本身,發送或接收訊息都是透過channel,嚴格來說算是利用shared memory傳遞訊息,不同的goroutine透過channel共用記憶體,但是goroutine的記憶體位置到channel buffer是利用copy memory的方式,不在乎是哪個對象發送或接收訊息

發送者和接收者之間藉由Channel鬆耦合,發送者不知道自己的訊息被哪个接收者處理了,接收者也不知道是哪一個發送者傳送消息。

發送訊息的一方關心訊息是否被處理,會有阻塞現象,有同步的現象。

actor模型示意圖 from Ref 3

在erlang中可以創建輕量級process(不同於OS的process),可類比為golang的goroutine,在創建process的同時可以得到它的id(在golang,我們不容易獲得goroutine的實體id,只能創建),而這個process也就是actor對象,每個actor對象如同golang中由select和channel組成的多路複用器(multiplexing)。

訊息的收送,並不是直接送給 process,每個actor(也就是 process)都各自擁有屬於自己的Mailbox,依傳入的順序存放未處理的訊息。讀取訊息時,則是依FIFO的順序取出,取出後利用匹配模式(pattern matching)尋找訊息符合哪一個Channel。
Ref1 : erlang的互動模型 — 選擇式接收

erlang基於actor模型來傳遞訊息,Actor對象是關注的重點,對象之間直接通訊,不需要通過中間物件,每個actor對象可以發送或接收訊息。

傳遞訊息如同by value的方式,將訊息複製到輕量級process,process使用自己的記憶體空間,自行維護內部狀態,是真正意義的不靠shared memory傳遞訊息,process之間各自獨立,不具有共享記憶體。

發送訊息的一方不在乎訊息是否被處理,發送方不會阻塞,為異步操作。

--

--

Gopher is cute
Caesar's study review on Web development

我的第一份後端工作結束了,短短四個月,部門全員掰掰,尋找新的機會。