go語言gc效率 go語言gtk

為什么go語言適合開發(fā)網游服務器端

前段時間在golang-China讀到這個貼:

成都創(chuàng)新互聯公司是一家專注于網站設計、成都做網站和服務器托管的網絡公司,有著豐富的建站經驗和案例。

個人覺得golang十分適合進行網游服務器端開發(fā),寫下這篇文章總結一下。

從網游的角度看:

要成功的運營一款網游,很大程度上依賴于玩家自發(fā)形成的社區(qū)。只有玩家自發(fā)形成一個穩(wěn)定的生態(tài)系統(tǒng),游戲才能持續(xù)下去,避免鬼城的出現。而這就需要多次大量導入用戶,在同時在線用戶量達到某個臨界點的時候,才有可能完成。因此,多人同時在線十分有必要。

再來看網游的常見玩法,除了排行榜這類統(tǒng)計和數據匯總的功能外,基本沒有需要大量CPU時間的應用。以前的項目里,即時戰(zhàn)斗產生的各種傷害計算對CPU的消耗也不大。玩家要完成一次操作,需要通過客戶端-服務器端-客戶端這樣一個來回,為了獲得高響應速度,滿足玩家體驗,服務器端的處理也不能占用太多時間。所以,每次請求對應的CPU占用是比較小的。

網游的IO主要分兩個方面,一個是網絡IO,一個是磁盤IO。網絡IO方面,可以分成美術資源的IO和游戲邏輯指令的IO,這里主要分析游戲邏輯的IO。游戲邏輯的IO跟CPU占用的情況相似,每次請求的字節(jié)數很小,但由于多人同時在線,因此并發(fā)數相當高。另外,地圖信息的廣播也會帶來比較頻繁的網絡通信。磁盤IO方面,主要是游戲數據的保存。采用不同的數據庫,會有比較大的區(qū)別。以前的項目里,就經歷了從MySQL轉向MongoDB這種內存數據庫的過程,磁盤IO不再是瓶頸。總體來說,還是用內存做一級緩沖,避免大量小數據塊讀寫的方案。

針對網游的這些特點,golang的語言特性十分適合開發(fā)游戲服務器端。

首先,go語言提供goroutine機制作為原生的并發(fā)機制。每個goroutine所需的內存很少,實際應用中可以啟動大量的goroutine對并發(fā)連接進行響應。goroutine與gevent中的greenlet很相像,遇到IO阻塞的時候,調度器就會自動切換到另一個goroutine執(zhí)行,保證CPU不會因為IO而發(fā)生等待。而goroutine與gevent相比,沒有了python底層的GIL限制,就不需要利用多進程來榨取多核機器的性能了。通過設置最大線程數,可以控制go所啟動的線程,每個線程執(zhí)行一個goroutine,讓CPU滿負載運行。

同時,go語言為goroutine提供了獨到的通信機制channel。channel發(fā)生讀寫的時候,也會掛起當前操作channel的goroutine,是一種同步阻塞通信。這樣既達到了通信的目的,又實現同步,用CSP模型的觀點看,并發(fā)模型就是通過一組進程和進程間的事件觸發(fā)解決任務的。雖然說,主流的編程語言之間,只要是圖靈完備的,他們就都能實現相同的功能。但go語言提供的這種協(xié)程間通信機制,十分優(yōu)雅地揭示了協(xié)程通信的本質,避免了以往鎖的顯式使用帶給程序員的心理負擔,確是一大優(yōu)勢。進行網游開發(fā)的程序員,可以將游戲邏輯按照單線程阻塞式的寫,不需要額外考慮線程調度的問題,以及線程間數據依賴的問題。因為,線程間的channel通信,已經表達了線程間的數據依賴關系了,而go的調度器會給予妥善的處理。

另外,go語言提供的gc機制,以及對指針的保護式使用,可以大大減輕程序員的開發(fā)壓力,提高開發(fā)效率。

展望未來,我期待go語言社區(qū)能夠提供更多的goroutine間的隔離機制。個人十分推崇erlang社區(qū)的脆崩哲學,推動應用發(fā)生預期外行為時,盡早崩潰,再fork出新進程處理新的請求。對于協(xié)程機制,需要由程序員保證執(zhí)行的函數不會發(fā)生死循環(huán),導致線程卡死。如果能夠定制goroutine所執(zhí)行函數的最大CPU執(zhí)行時間,及所能使用的最大內存空間,對于提升系統(tǒng)的魯棒性,大有裨益。

為什么要使用 Go 語言?Go 語言的優(yōu)勢在哪里

1、學習曲線

它包含了類C語法、GC內置和工程工具。這一點非常重要,因為Go語言容易學習,所以一個普通的大學生花一個星期就能寫出來可以上手的、高性能的應用。在國內大家都追求快,這也是為什么國內Go流行的原因之一。

2、效率

Go擁有接近C的運行效率和接近PHP的開發(fā)效率,這就很有利的支撐了上面大家追求快速的需求。

3、出身名門、血統(tǒng)純正

之所以說Go語言出身名門,是因為我們知道Go語言出自Google公司,這個公司在業(yè)界的知名度和實力自然不用多說。Google公司聚集了一批牛人,在各種編程語言稱雄爭霸的局面下推出新的編程語言,自然有它的戰(zhàn)略考慮。而且從Go語言的發(fā)展態(tài)勢來看,Google對它這個新的寵兒還是很看重的,Go自然有一個良好的發(fā)展前途。我們看看Go語言的主要創(chuàng)造者,血統(tǒng)純正這點就可見端倪了。

4、組合的思想、無侵入式的接口

Go語言可以說是開發(fā)效率和運行效率二者的完美融合,天生的并發(fā)編程支持。Go語言支持當前所有的編程范式,包括過程式編程、面向對象編程以及函數式編程。

5、強大的標準庫

這包括互聯網應用、系統(tǒng)編程和網絡編程。Go里面的標準庫基本上已經是非常穩(wěn)定,特別是我這里提到的三個,網絡層、系統(tǒng)層的庫非常實用。

6、部署方便

我相信這一點是很多人選擇Go的最大理由,因為部署太方便,所以現在也有很多人用Go開發(fā)運維程序。

7、簡單的并發(fā)

它包含降低心智的并發(fā)和簡易的數據同步,我覺得這是Go最大的特色。之所以寫正確的并發(fā)、容錯和可擴展的程序如此之難,是因為我們用了錯誤的工具和錯誤的抽象,Go可以說這一塊做的相當簡單。

8、穩(wěn)定性

Go擁有強大的編譯檢查、嚴格的編碼規(guī)范和完整的軟件生命周期工具,具有很強的穩(wěn)定性,穩(wěn)定壓倒一切。那么為什么Go相比于其他程序會更穩(wěn)定呢?這是因為Go提供了軟件生命周期的各個環(huán)節(jié)的工具,如go

tool、gofmt、go test。

使用Go 語言開發(fā)大型 MMORPG 游戲伺服器怎么樣

使用Go 語言開發(fā)大型 MMORPG 游戲伺服器怎么樣

如果是大型網路游戲的話,我覺得是不合適的?,F階段go語言的執(zhí)行效率還是太低了。在底層編譯器的優(yōu)化方面做得和c++相比還是差了不少。go語言也是比較適合快速開發(fā)的專案比較合適

從2013年起,經朋友推薦開始用Golang編寫游戲登陸伺服器, 配合C++做第三方平臺驗證. 到編寫獨立工具導表工具GitHub - davyxu/tabtoy: 跨平臺的高效能便捷電子表格匯出器. 以及網路庫GitHub - davyxu/cell: 簡單,方便,高效的Go語言的游戲伺服器底層. 最終使用這些工具及庫編寫整個游戲伺服器框架, 我的感受是很不錯的

細節(jié)看來, 有如下的幾個點:

語言, 庫

Golang語言特性和C很像, 簡單, 一張A4紙就能寫完所有特性. 你想想看, C++到了領悟階段, 也只用那幾個簡單特性, 剩下的都是一大堆解決各種記憶體問題的技巧. 而Golang一開始就簡單, 何必浪費生命去研究那一大堆的奇技淫巧呢?

Golang的坑只有2個:1. interface{}和nil配合使用, 2. for回圈時, 將回圈變數引入閉包(Golang, Lua, C#閉包變數捕獲差異) 完全不影響正常使用, 復合語言概念, 只是看官方后面怎么有效的避免

用Golang就忘記繼承那套東西, 用組合+介面

用Golang伺服器如何保證解決游戲伺服器存檔一致性問題? s the world是肯定的, 但是Golang可以從語言層并發(fā)序列化玩家資料, 再通過后臺存檔

channel是goroutine雖然是Golang的語言特性. 但是在編寫伺服器時, 其實只有底層用的比較多.

Golang的第三方庫簡直多如牛毛, 好的也很多

不要說模板了, C#的也不好用, 官方在糾結也不要加, 使用中, 沒模板確實有點不方便. 用interface{}/反射做泛型對于Golang這種強型別語言來說,還是有點打臉

執(zhí)行期

Golang和C++比效能的話, 這是C++的優(yōu)勢, Golang因為沒虛擬機器, 只有薄薄的一層排程層. 因此效能是非常高的, 用一點效能犧牲換開發(fā)效率, 妥妥的

1.6版后的GC優(yōu)化的已經很好了, 如果你不是高效能,高并發(fā)Web應用, 非要找出一堆的優(yōu)化技巧的話. 只用Golang寫點游戲伺服器, 那點GC損耗可以忽略不計

和其他現代語言一樣, 崩潰捕捉是標配功能, 我用Golang的伺服器線上跑, 基本沒碰到過崩潰情況

熱更新: 官方已經有plugin系統(tǒng)的提交, 跨平臺的. 估計很快就可以告別手動cgo做so熱更新

開發(fā), 除錯, 部署, 優(yōu)化

LiteIDE是我首選的Golang的IDE, 雖然有童鞋說B格不高. 但這估計實在是找不到缺點說了, 別跟我說Visual Studio, 那是宇宙級的...

曾經聽說有人不看好Golang, 我問為啥: 說這么新的語言, 不好招人,后面打聽到他是個策劃... 好吧

真實情況是這樣的: Golang對于有點程式設計基礎的新人來說, 1周左右可以開始貢獻程式碼. 老司機2~3天.

開發(fā)效率還是不錯的, 一般大的游戲功能, 2*2人一周3~4個整完. 這換C++時代, 大概也就1~2個還寫不完. 對接伺服器sdk的話, 大概1天接個10多個沒問題

Golang自帶效能調優(yōu)工具, 從記憶體, CPU, 阻塞點等幾個方面直接出圖進行分析, 非常直觀, 可以參考我部落格幾年前的分析: 使用Golang進行效能分析(Profiling)

Golang支 *** 叉編譯, 跨平臺部署, 什么概念? linux是吧? 不問你什么版本, 直接windows上編譯輸出一個elf, 甩到伺服器上開跑.不超過1分鐘時間..

1.為什么golang的開發(fā)效率高?

golang是一編譯型的強型別語言,它在開發(fā)上的高效率主要來自于后發(fā)優(yōu)勢,不用考慮舊有惡心的歷史,又有一個較高的工程視角。良好的避免了程式設計師因為“ { 需不需要獨占一行 ”這種革命問題打架,也解決了一部分趁編譯時間找產品妹妹搭訕的階級敵人。

它有自己的包管理機制,工具鏈成熟,從開發(fā)、除錯到釋出都很簡單方便;

有反向介面、defer、coroutine等大量的syntactic sugar;

編譯速度快,因為是強型別語言又有gc,只要通過編譯,非業(yè)務毛病就很少了;

它在語法級別上支援了goroutine,這是大家說到最多的內容,這里重點提一下。首先,coroutine并不稀罕,語言并不能超越硬體、作業(yè)系統(tǒng)實現神乎其神的功能。golang可以做到事情,其他語言也可以做到,譬如c++,在boost庫里面自己就有的coroutine實現(當然用起來跟其他boost庫一樣惡心)。golang做的事情,是把這一套東西的使用過程簡化了,并且提供了一套channel的通訊模式,使得程式設計師可以忽略諸如死鎖等問題。

goroutine的目的是描述并發(fā)程式設計模型。并發(fā)與并行不同,它并不需要多核的硬體支援,它不是一種物理執(zhí)行狀態(tài),而是一種程式邏輯流程。它的主要目的不是利用多核提高執(zhí)行效率,而是提供一種更容易理解、不容易出錯的語言來描述問題。

實際上golang預設就是執(zhí)行在單OS程序上面的,通過指定環(huán)境變數GOMAXPROCS才能轉身跑在多OS程序上面。有人提到了網易的pomelo,開源本來是一件很不錯的事情,但是基于自己對callback hell的偏見,我一直持有這種態(tài)度:敢用nodejs寫大規(guī)模游戲伺服器的人,都是真正的勇士 : ) 。

2、Erlang與Golang的coroutine有啥區(qū)別,coroutine是啥?

coroutine本質上是語言開發(fā)者自己實現的、處于user space內的執(zhí)行緒,無論是erlang、還是golang都是這樣。需要解決沒有時鐘中斷;碰著阻塞式i\o,整個程序都會被作業(yè)系統(tǒng)主動掛起;需要自己擁有排程控制能力(放在并行環(huán)境下面還是挺麻煩的一件事)等等問題。那為啥要廢老大的勁自己做一套執(zhí)行緒放user space里面呢?

并發(fā)是伺服器語言必須要解決的問題;

system space的程序還有執(zhí)行緒排程都太慢了、占用的空間也太大了。

把執(zhí)行緒放到user space的可以避免了陷入system call進行上下文切換以及高速緩沖更新,執(zhí)行緒本身以及切換等操作可以做得非常的輕量。這也就是golang這類語言反復提及的超高并發(fā)能力,分分鐘給你開上幾千個執(zhí)行緒不費力。

不同的是,golang的并發(fā)排程在i/o等易發(fā)阻塞的時候才會發(fā)生,一般是內封在庫函式內;erlang則更夸張,對每個coroutine維持一個計數器,常用語句都會導致這個計數器進行reduction,一旦到點,立即切換排程函式。

中斷介入程度的不同,導致erlang看上去擁有了preemptive scheduling的能力,而golang則是cooperative shceduling的。golang一旦寫出純計算死回圈,程序內所有會話必死無疑;要有大計算量少i\o的函式還得自己主動叫runtime.Sched()來進行排程切換。

3、golang的執(zhí)行效率怎么樣?

我是相當反感所謂的ping\pong式benchmark,執(zhí)行效率需要放到具體的工作環(huán)境下面考慮。

首先,它再快也是快不過c的,畢竟底下做了那么多工作,又有排程,又有gc什么的。那為什么在那些benchmark里面,golang、nodejs、erlang的響應效率看上去那么優(yōu)秀呢,響應快,并發(fā)強?并發(fā)能力強的原因上面已經提到了,響應快是因為大量非阻塞式i\o操作出現的原因。這一點c也可以做到,并且能力更強,但是得多寫不少優(yōu)質程式碼。

然后,針對游戲伺服器這種高實時性的執(zhí)行環(huán)境,GC所造成的跳幀問題確實比較麻煩,前面的大神 @達達 有比較詳細的論述和緩解方案,就不累述了 。隨著golang的持續(xù)開發(fā),相信應該會有非常大的改進。一是遮蔽記憶體操作是現代語言的大勢所趨,它肯定是需要被實現的;二是GC演算法已經相當的成熟,效率勉勉強強過得去;三是可以通過incremental的操作來均攤cpu消耗。

用這一點點效率損失換取一個更高的生產能力是不是值得呢?我覺得是值得的,硬體已經很便宜了,人生苦短,讓自己的生活更輕松一點吧: )。

4、基于以上的論述,我認為采用go進行小范圍的MMORPG開發(fā)是可行的。

如果跟C語言比,大部分指令碼都勝出啊。Go, Node.js, Python ......

網易弄過一個Node.js的開源伺服器框架。

至于IDE, 不重要,做伺服器開發(fā)很少會要開著IDE除錯的。最常用的手段就是打Log. 設定了斷點也很難調,多個客戶端并發(fā)。

那種單客戶端連線進來就可以重現的bug倒是可以用IDE調,但是這種bug本來就容易解決。

用指令碼語言,有一個很大的好處是容易做自動測試,可以更好地保證程式碼質量。

--------------------------

開發(fā)效率當然是指令碼高。執(zhí)行效率,其實更重要的是并發(fā),框架合理的話增加機器就可以直接提高效率增加人數。

用Go開發(fā)大型mmorpg服務端不會有問題的,如果掉坑里肯定不會是語言的問題。

唯一比較可能掉進去的坑就只有GC,其實很容易預防和調整的,具體細節(jié)可以看我部落格分享的文章。

但是技術選型不只是選語言,如果當時我手頭有一套效能滿意,開發(fā)效率OK,人員補給不會有問題的技術方案,不管是什么語言的,我肯定不會放棄它而選擇冒險的。

public void actionPerformed(ActionEvent e)

{

if(e.getSource()==xinjian)

{

text.setText("");

}

if(e.getSource()==dakai)

{

openFD.show();

String s;

名稱欄目:go語言gc效率 go語言gtk
轉載來源:http://www.muchs.cn/article44/ddcjghe.html

成都網站建設公司_創(chuàng)新互聯,為您提供面包屑導航、做網站、品牌網站制作、外貿建站、云服務器網站策劃

廣告

聲明:本網站發(fā)布的內容(圖片、視頻和文字)以用戶投稿、用戶轉載內容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網站立場,如需處理請聯系客服。電話:028-86922220;郵箱:631063699@qq.com。內容未經允許不得轉載,或轉載時需注明來源: 創(chuàng)新互聯

h5響應式網站建設