真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

go語言協(xié)程切換 go協(xié)程切換原理

go語言寫后端快不快

比c++快,go用到了協(xié)程,而c++只能使用線程,協(xié)程切換幾乎不占用或很少占用cpu資源,而線程切換卻占用cpu資源較多,這就導(dǎo)致了在相同并發(fā)數(shù)的情況下,go語言開發(fā)的程序可以提高cpu的有效工作率,所以go語言做后端快發(fā)效率還是比較好的。

成都創(chuàng)新互聯(lián)公司堅(jiān)持“要么做到,要么別承諾”的工作理念,服務(wù)領(lǐng)域包括:成都網(wǎng)站建設(shè)、網(wǎng)站設(shè)計(jì)、企業(yè)官網(wǎng)、英文網(wǎng)站、手機(jī)端網(wǎng)站、網(wǎng)站推廣等服務(wù),滿足客戶于互聯(lián)網(wǎng)時代的蓮池網(wǎng)站設(shè)計(jì)、移動媒體設(shè)計(jì)的需求,幫助企業(yè)找到有效的互聯(lián)網(wǎng)解決方案。努力成為您成熟可靠的網(wǎng)絡(luò)建設(shè)合作伙伴!

Golang 線程和協(xié)程的區(qū)別

線程:

多線程是為了解決CPU利用率的問題,線程則是為了減少上下文切換時的開銷,進(jìn)程和線程在Linux中沒有本質(zhì)區(qū)別,最大的不同就是進(jìn)程有自己獨(dú)立的內(nèi)存空間,而線程是共享內(nèi)存空間。

在進(jìn)程切換時需要轉(zhuǎn)換內(nèi)存地址空間,而線程切換沒有這個動作,所以線程切換比進(jìn)程切換代價要小得多。

協(xié)程:

想要簡單,又要性能高,協(xié)程就可以達(dá)到我們的目的,它是用戶視角的一種抽象,操作系統(tǒng)并沒有這個概念,主要思想是在用戶態(tài)實(shí)現(xiàn)調(diào)度算法,用少量線程完成大量任務(wù)的調(diào)度。

Goroutine是GO語言實(shí)現(xiàn)的協(xié)程,其特點(diǎn)是在語言層面就支持,使用起來十分方便,它的核心是MPG調(diào)度模型:M即內(nèi)核線程;P即處理器,用來執(zhí)行Goroutine,它維護(hù)了本地可運(yùn)行隊(duì)列;G即Goroutine,代碼和數(shù)據(jù)結(jié)構(gòu);S及調(diào)度器,維護(hù)M和P的信息。

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

個人覺得golang十分適合進(jìn)行網(wǎng)游服務(wù)器端開發(fā),寫下這篇文章總結(jié)一下。 從網(wǎng)游的角度看: 要成功的運(yùn)營一款網(wǎng)游,很大程度上依賴于玩家自發(fā)形成的社區(qū)。只有玩家自發(fā)形成一個穩(wěn)定的生態(tài)系統(tǒng),游戲才能持續(xù)下去,避免鬼城的出現(xiàn)。而這就需要多次大量導(dǎo)入用戶,在同時在線用戶量達(dá)到某個臨界點(diǎn)的時候,才有可能完成。因此,多人同時在線十分有必要。 再來看網(wǎng)游的常見玩法,除了排行榜這類統(tǒng)計(jì)和數(shù)據(jù)匯總的功能外,基本沒有需要大量CPU時間的應(yīng)用。以前的項(xiàng)目里,即時戰(zhàn)斗產(chǎn)生的各種傷害計(jì)算對CPU的消耗也不大。玩家要完成一次操作,需要通過客戶端-服務(wù)器端-客戶端這樣一個來回,為了獲得高響應(yīng)速度,滿足玩家體驗(yàn),服務(wù)器端的處理也不能占用太多時間。所以,每次請求對應(yīng)的CPU占用是比較小的。 網(wǎng)游的IO主要分兩個方面,一個是網(wǎng)絡(luò)IO,一個是磁盤IO。網(wǎng)絡(luò)IO方面,可以分成美術(shù)資源的IO和游戲邏輯指令的IO,這里主要分析游戲邏輯的IO。游戲邏輯的IO跟CPU占用的情況相似,每次請求的字節(jié)數(shù)很小,但由于多人同時在線,因此并發(fā)數(shù)相當(dāng)高。另外,地圖信息的廣播也會帶來比較頻繁的網(wǎng)絡(luò)通信。磁盤IO方面,主要是游戲數(shù)據(jù)的保存。采用不同的數(shù)據(jù)庫,會有比較大的區(qū)別。以前的項(xiàng)目里,就經(jīng)歷了從MySQL轉(zhuǎn)向MongoDB這種內(nèi)存數(shù)據(jù)庫的過程,磁盤IO不再是瓶頸??傮w來說,還是用內(nèi)存做一級緩沖,避免大量小數(shù)據(jù)塊讀寫的方案。 針對網(wǎng)游的這些特點(diǎn),golang的語言特性十分適合開發(fā)游戲服務(wù)器端。 首先,go語言提供goroutine機(jī)制作為原生的并發(fā)機(jī)制。每個goroutine所需的內(nèi)存很少,實(shí)際應(yīng)用中可以啟動大量的goroutine對并發(fā)連接進(jìn)行響應(yīng)。goroutine與gevent中的greenlet很相像,遇到IO阻塞的時候,調(diào)度器就會自動切換到另一個goroutine執(zhí)行,保證CPU不會因?yàn)镮O而發(fā)生等待。而goroutine與gevent相比,沒有了python底層的GIL限制,就不需要利用多進(jìn)程來榨取多核機(jī)器的性能了。通過設(shè)置最大線程數(shù),可以控制go所啟動的線程,每個線程執(zhí)行一個goroutine,讓CPU滿負(fù)載運(yùn)行。 同時,go語言為goroutine提供了獨(dú)到的通信機(jī)制channel。channel發(fā)生讀寫的時候,也會掛起當(dāng)前操作channel的goroutine,是一種同步阻塞通信。這樣既達(dá)到了通信的目的,又實(shí)現(xiàn)同步,用CSP模型的觀點(diǎn)看,并發(fā)模型就是通過一組進(jìn)程和進(jìn)程間的事件觸發(fā)解決任務(wù)的。雖然說,主流的編程語言之間,只要是圖靈完備的,他們就都能實(shí)現(xiàn)相同的功能。但go語言提供的這種協(xié)程間通信機(jī)制,十分優(yōu)雅地揭示了協(xié)程通信的本質(zhì),避免了以往鎖的顯式使用帶給程序員的心理負(fù)擔(dān),確是一大優(yōu)勢。進(jìn)行網(wǎng)游開發(fā)的程序員,可以將游戲邏輯按照單線程阻塞式的寫,不需要額外考慮線程調(diào)度的問題,以及線程間數(shù)據(jù)依賴的問題。因?yàn)?,線程間的channel通信,已經(jīng)表達(dá)了線程間的數(shù)據(jù)依賴關(guān)系了,而go的調(diào)度器會給予妥善的處理。 另外,go語言提供的gc機(jī)制,以及對指針的保護(hù)式使用,可以大大減輕程序員的開發(fā)壓力,提高開發(fā)效率。 展望未來,我期待go語言社區(qū)能夠提供更多的goroutine間的隔離機(jī)制。個人十分推崇erlang社區(qū)的脆崩哲學(xué),推動應(yīng)用發(fā)生預(yù)期外行為時,盡早崩潰,再fork出新進(jìn)程處理新的請求。對于協(xié)程機(jī)制,需要由程序員保證執(zhí)行的函數(shù)不會發(fā)生死循環(huán),導(dǎo)致線程卡死。


文章標(biāo)題:go語言協(xié)程切換 go協(xié)程切換原理
本文路徑:http://weahome.cn/article/doidogj.html

其他資訊

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部