Golang 的併發與 Erlang Scala Node js 和 Python 的併發模型相比有何特點?

時間 2021-05-14 14:53:16

1樓:北俠

開發過一段時間Erlang和Golang,也優化過Erlang虛擬機器,個人覺得兩者最大的不同是:

1)Erlang是解釋執行的,Golang是靜態強型別,理論上Golang執行效率比Erlang高乙個數量級;

2)Erlang排程器看重的是公平性,每個process賦予reduction,reduction消耗完了,這個process的執行權就被搶占了;Golang雖然也有搶占但是比Erlang粗糙很多,因為Golang是靜態的

3)至於併發模型僅僅是語法上的不同而已,另外,Erlang的mailbox每個process只有乙個,因此而且是匿名的,通過模式匹配消費訊息;Golang的channel是具名的,可以建立出n個,傳送訊息也需要執行channel名,channel本質上就是乙個執行緒安全的佇列

4)關於GC,Erlang的gc是沒有STW的,gc是process級別的;Golang的GC是全域性,當然兩者都是併發gc

5)關於網路,Erlang官方vm的網路模組只有乙個epoll,Golang有n個。之前做過對Erlang Pollset的優化,在Erlang process層面實現多個Pollset,不侵入vm,可以和官方vm一起公升級,專案最終也上到了生產環境,思路挺有意思

github上可以搜尋erlang_multi_pollset

2樓:LJZN

Erlang的設計初衷就是「面向併發程式設計」。

如果題主沒有接觸過函式式語言,或者對OO語言比較熟悉,並且想要使用Erlang的威力,那麼非常推薦Elixir。

Elixir可以任意呼叫Erlang中的庫,包括久經考驗的OTP工具。語法非常簡單,能看到Ruby的影子。

3樓:彭哲夫

老實講erlang是所謂併發目前我見到的最佳解決方案,沒有之一。

go和rust大體上是走了抄erlang的路子,不過引入了coroutine和channel的概念,簡單的來說就是乙個我等待IO的時候控制權交給你這樣的行為,channel負責排程和通訊。然後,python也有類似的直譯器,叫stackless python,stackless,一下子就解釋清楚了,具體的可以蒐個維基,幾句話講不清。

而傳統意義上python/ruby的併發是執行緒,以前ruby不是native的,現在也是native的了,GIL負責大顆粒的執行緒安全,但是,目前流行的做法卻還是coroutine這類的實現,ruby我不知道是啥,python的有gevent,eventlet啥的,底層是greenlet,而這個greenlet你可以理解為就和go的goroutine。

但由於直譯器先天限制,Cpython能做到的也就是差不多而已,因為缺乏channel,因此有乙個排程中心負責幹這事,等於就是說我等待IO的時候控制權給排程中心排程中心再去給你控制權這樣。

至於node.js,event-driven而已,本質上是我剛才說的那種行為的抽象,所以會有callback hell,當然你封裝一下就好了,大體行為上其實沒多大區別。

總之呢,高併發通訊erlang/stackless python,一般高併發呢go/rush,提高生產力呢python的gevent這類就好了,看場景。

4樓:asta謝

erlang和golang都是採用了CSP的模式,Communicating Sequential Processes。但是erlang是基於程序的訊息通訊,go是基於goroutine和channel的通訊。至於python就是乙個多執行緒而已,沒有什麼其他的技術,nodejs是乙個非同步操作庫,思路完全是不一樣的。

我也不知道那種比較優秀,我覺得就看你喜歡那種實現方式而已。

linux的linus與golang三位開發者能不能比

andrew show Ken Thompson的C語言和Unix作業系統以及它們反映的設計理念創造了乙個領域的正規化,而且奇妙的是迄今為止這些理念以及正規化依然可以適用,我不否認linus的偉大貢獻,但是和Ken Thompson比應該還有所不如。 正如我在這個話題下面回答的那樣,我對程式設計師的...

Golang和Rust的胖指標與C 的指標指向虛表哪種設計更好

OFFLINE C 的更好.反正至少有乙個固定開銷.那些不當自己是物件的物件,叫做結構.喜歡用結構就用結構,喜歡用虛類就用虛類,為了把虛類當結構用,省那麼一點時間搞胖指標出來,沒啥意義. Davie 我個人理解虛指標也就是共享,虛表是一種定址解釋物件方式,是物件的透明成員,程式設計師是不可見的。它只...

golang 好用的log庫有哪些?

詠春警告的胖虎 distillog 分級日誌記錄庫。glg 簡單 快速 分級的日誌庫 glo 分級記錄日誌的庫 glog Go的分級日誌 go cronowriter 對日誌檔案基於當前日期和時間進行自動迴圈寫入的庫,類似 cronolog.go log 乙個包含rack traces 物件轉儲和可...