日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

不是语言之争---Go vs Erlang

發(fā)布時間:2025/7/14 编程问答 24 豆豆
生活随笔 收集整理的這篇文章主要介紹了 不是语言之争---Go vs Erlang 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

因為 云巴 系統(tǒng)對高并發(fā)、低延遲的需求,我們對各個語言、平臺做了很多的調(diào)研比較工作。這自然就包括致力于開發(fā)高并發(fā)應(yīng)用的 Go 和 Erlang。

并發(fā)

Go 對高并發(fā)的支持通過 goroutine 實現(xiàn)。goroutine 可以理解為輕量級的 線程(thread)。同一個 Go 應(yīng)用創(chuàng)建的 goroutine 共享地址空間。

Erlang 的高并發(fā)通過輕量級 進(jìn)程(process)實現(xiàn),每一個進(jìn)程都有獨(dú)立的狀態(tài)記錄。

另外,使用 goroutine 要注意,goroutine 運(yùn)行完畢后,占用的內(nèi)存放回內(nèi)存池備用,不會釋放。

對于每一個任務(wù)都需要有獨(dú)立狀態(tài)的場景,Erlang 的 process 更有優(yōu)勢。

搶占式調(diào)度

Erlang 的任務(wù)調(diào)度器有一個 reduction budget 的概念。進(jìn)程的任何操作都會造成預(yù)算消耗,包括 函數(shù)調(diào)用、調(diào)用 BIF、進(jìn)程堆垃圾回收、ETS 讀寫、發(fā)消息(目標(biāo)郵箱堆積的消息越多,消耗越大)。Erlang 的 正則表達(dá)式庫 也被做了修改以支持 reductions。所以如果進(jìn)程在長時間執(zhí)行正則表達(dá)式匹配,也一樣會消耗 reductions,也會被搶占。

Go 之前的調(diào)度器只在 syscall 發(fā)生時調(diào)度,優(yōu)化后可以在任何函數(shù)調(diào)用時調(diào)度。但是要注意,如果在 goroutine 里寫一個死循環(huán),Go 的調(diào)度器不能有效搶占,同一個調(diào)度器的 其他 goroutine 會被掛起。

垃圾回收

像 Java 一樣,Go 的垃圾回收是全局的,這意味著一旦垃圾回收被觸發(fā),所有的 goroutine 都會被暫停,造成一段時間的業(yè)務(wù)延遲。

Erlang 的垃圾回收是 進(jìn)程 級別的,每一個進(jìn)程都有自己獨(dú)立的垃圾回收器,一個進(jìn)程的垃圾回收被觸發(fā),不會造成其他進(jìn)程被掛起。相對來說帶來的業(yè)務(wù)延遲小。

錯誤處理

Erlang 的每一個進(jìn)程都有 進(jìn)程 ID (PID),同時也可以給進(jìn)程注冊名字,也就是說每一個進(jìn)程都有獨(dú)立的身份,可以有效的監(jiān)控每一個進(jìn)程的狀態(tài)。進(jìn)程異常退出時,可以捕捉到退出事件,并重啟進(jìn)程(參見 otp 的 supervisor/worker)。

Go 的 goroutine 沒有身份識別,goroutine 的狀態(tài)沒辦法監(jiān)控。

動態(tài)反射

Erlang 動態(tài)語言的特點,使它天然支持 REPL,另外 Erlang 支持 remote shell,我們可以在 Erlang 運(yùn)行時,連接到 remote shell 與任何一個進(jìn)程交互。這些特性對一個需要長期運(yùn)行的復(fù)雜系統(tǒng)的維護(hù)帶來了極大的便利。開發(fā)階段也能有一些便利。

Go 是靜態(tài)語言,不支持 REPL。

靜態(tài)編譯

Erlang 是動態(tài)語言,有所有動態(tài)語言的所有缺點:

  • 運(yùn)行速度慢
  • 不能做早期錯誤檢查,需要依賴全覆蓋單元測試
  • 代碼規(guī)模大了,給編寫帶來困擾
  • Erlang 現(xiàn)在也引入了 spec,對函數(shù)的參數(shù)返回值在編譯時做類型檢查,但是跟靜態(tài)語言比起來效果差的很遠(yuǎn)。

    不過正是因為是動態(tài)語言,Erlang 實現(xiàn)了運(yùn)行時代碼替換,這個特性對一個需要長時間運(yùn)行的工業(yè)級產(chǎn)品,是一個非常重要的功能。

    Go 是靜態(tài)語言,運(yùn)行速度快,編譯時做嚴(yán)格的類型檢查,可以避免很多隱患。

    框架

    Erlang 的 OTP 框架支持服務(wù)器端開發(fā)常見的幾種模式(applications, supervisors, wokers),方便代碼的組織。

    Go 暫時沒看到類似的框架。

    第三方庫支持

    Go 是一個相對比較新的語言,雖說現(xiàn)在很多項目都開始支持 Go,但很多第三方庫的成熟度暫時不如 Erlang。

    總結(jié)

    對于要求低延遲、高并發(fā)的后端服務(wù),我們近期還是采用 Erlang 為主。但使用 Erlang 的過程中,Erlang 缺乏靜態(tài)檢查的手段,也是一個很麻煩的問題,目前的做法是要求大家都使用 IntelliJ IDEA 編寫代碼,可以通過 IDE 提前發(fā)現(xiàn)部分語言問題。

    同時我們會持續(xù)關(guān)注 Go 的發(fā)展。

    關(guān)于作者:
    weibo: @Tiger_張虎, 云巴 (yunba.io) 創(chuàng)始人,yunba.io 云后端服務(wù)。 JPush 創(chuàng)始人,原CTO。 Oracle VM 創(chuàng)始團(tuán)隊成員。
    原文:http://zhang.hu/go-vs-erlang/

    總結(jié)

    以上是生活随笔為你收集整理的不是语言之争---Go vs Erlang的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。