1、從學(xué)術(shù)的角度講Go語言其實非常平庸,不支持許多高級的語言特性;但從工程的角度講,Go的設(shè)計是非常優(yōu)秀的:規(guī)范足夠簡單靈活,有其他語言基礎(chǔ)的程序員都能迅速上手。
創(chuàng)新互聯(lián)公司服務(wù)項目包括和順網(wǎng)站建設(shè)、和順網(wǎng)站制作、和順網(wǎng)頁制作以及和順網(wǎng)絡(luò)營銷策劃等。多年來,我們專注于互聯(lián)網(wǎng)行業(yè),利用自身積累的技術(shù)優(yōu)勢、行業(yè)經(jīng)驗、深度合作伙伴關(guān)系等,向廣大中小型企業(yè)、政府機(jī)構(gòu)等提供互聯(lián)網(wǎng)行業(yè)的解決方案,和順網(wǎng)站推廣取得了明顯的社會效益與經(jīng)濟(jì)效益。目前,我們服務(wù)的客戶以成都為中心已經(jīng)輻射到和順省份的部分城市,未來相信會繼續(xù)擴(kuò)大服務(wù)區(qū)域并繼續(xù)獲得客戶的支持與信任!
2、go語言的特點 部署簡單。Go編譯生成的是一個靜態(tài)可執(zhí)行文件,除了glibc外沒有其他外部依賴。
3、自0版發(fā)布以來,go語言引起了眾多開發(fā)者的關(guān)注,并得到了廣泛的應(yīng)用。go語言簡單、高效、并發(fā)的特點吸引了許多傳統(tǒng)的語言開發(fā)人員,其數(shù)量也在不斷增加。使用 Go 語言開發(fā)的開源項目非常多。
4、Goroutine 這個幾乎算是Go語言的招牌特性之一了,我也不想多提。
1、Go語言采用兩級線程模型,即用戶線程與內(nèi)核線程KSE(kernel scheduling entity)是M:N的。最終goroutine還是會交給OS線程執(zhí)行,但是需要一個中介,提供上下文。
2、Go的CSP并發(fā)模型,是通過 goroutine和channel 來實現(xiàn)的。 goroutine 是Go語言中并發(fā)的執(zhí)行單位。其實就是協(xié)程。 channel是Go語言中各個并發(fā)結(jié)構(gòu)體(goroutine)之前的通信機(jī)制。
3、我們通過 go func()來創(chuàng)建一個goroutine;有兩個存儲G的隊列,一個是局部調(diào)度器P的本地隊列、一個是全局G隊列。
4、Go語言的出現(xiàn),填補了許多編程語言在并發(fā)編程方面的空缺。它提供了一種輕量級線程模型,通過協(xié)程(goroutine)的方式,實現(xiàn)了高效的并發(fā)編程。
5、go線程模型包含三個概念:內(nèi)核線程(M),goroutine(G),G的上下文環(huán)境(P);GMP模型是goalng特有的。P與M一般是一一對應(yīng)的。
6、同時,go語言為goroutine提供了獨到的通信機(jī)制channel。channel發(fā)生讀寫的時候,也會掛起當(dāng)前操作channel的goroutine,是一種同步阻塞通信。
Go語言運行時,通過核心元素G,M,P 和 自己的調(diào)度器,實現(xiàn)了自己的并發(fā)線程模型。調(diào)度器通過對G,M,P的調(diào)度實現(xiàn)了兩級線程模型中操作系統(tǒng)內(nèi)核之外的調(diào)度任務(wù)。
我們通過 go func()來創(chuàng)建一個goroutine;有兩個存儲G的隊列,一個是局部調(diào)度器P的本地隊列、一個是全局G隊列。
go10\src\runtime\runtimego Go調(diào)度器根據(jù)事件進(jìn)行上下文切換。調(diào)度的目的就是防止M堵塞,空閑,系統(tǒng)進(jìn)程切換。詳見 Golang - 調(diào)度剖析【第二部分】Linux可以通過epoll實現(xiàn)網(wǎng)絡(luò)調(diào)用,統(tǒng)稱網(wǎng)絡(luò)輪詢器N(Net Poller)。
golang的協(xié)程是基于gpm機(jī)制,是可以多核多線程的。Python的協(xié)程是eventloop模型(IO多路復(fù)用技術(shù))實現(xiàn),協(xié)程是嚴(yán)格的 1:N 關(guān)系,也就是一個線程對應(yīng)了多個協(xié)程。雖然可以實現(xiàn)異步I/O,但是不能有效利用多核(GIL)。