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 物件轉儲和可...