猶記得2019年中旬進(jìn)行知識(shí)點(diǎn)的學(xué)習(xí)和demo的練習(xí),熟悉各種語法和并發(fā)調(diào)度的場(chǎng)景,
在2019年末開始參與項(xiàng)目實(shí)戰(zhàn)開發(fā)和邏輯梳理
Go語言的接觸也是更多探索和業(yè)務(wù)的拆件,做一些雛形工具,來慢慢的孵化業(yè)務(wù)生態(tài)
后來陸陸續(xù)續(xù),在主營(yíng)業(yè)務(wù)是PHP的情況下,盡量在業(yè)務(wù)腳本的傾向上使用Go語言,雖然前期兩種語言的混合使用,總會(huì)導(dǎo)致寫法沖突,但好在這個(gè)磨合期平穩(wěn)度過。
后來也會(huì)將公司更多的業(yè)務(wù)傾向于Go來進(jìn)行處理,比如新項(xiàng)目,或者老項(xiàng)目對(duì)并發(fā)要求高的項(xiàng)目會(huì)優(yōu)先考慮。
羅列下Go語言的特點(diǎn):
Go主要有靜態(tài)語言、天生并發(fā)、內(nèi)置GC、安全性高、語法簡(jiǎn)單、交叉編譯和編譯快速這幾個(gè)方面的特性。
這些特性決定了Go的三個(gè)高富帥特性:運(yùn)行快、開發(fā)快和部署快,而這些特性都是針對(duì)Google遇到的一些痛點(diǎn)來設(shè)計(jì)的。
優(yōu)勢(shì)
- Go天生的自帶并發(fā)調(diào)度,如協(xié)程和通道,且協(xié)程內(nèi)存占用少,一個(gè)Goroutine??臻g最小2K
- Go自帶的格式統(tǒng)一,gofmt工具
- Go語法的簡(jiǎn)潔,可讀性強(qiáng),嚴(yán)格語言規(guī)范
- Go作為靜態(tài)語言,編譯效率高,性能相對(duì)高
- Go跨平臺(tái)的編譯使用,跟操作shell命令一樣的調(diào)用,部署方便,目前很多腳本都是這么來做的。
- 豐富的內(nèi)置類型,內(nèi)置強(qiáng)大的工具
- 內(nèi)置runtime,自動(dòng)垃圾回收機(jī)制
不足
- 錯(cuò)誤處理,會(huì)有錯(cuò)誤難獲取
- 基于github獲取代碼庫,會(huì)存在有代碼庫下架問題
Go適合做什么
- 服務(wù)器編程,如:處理日志,數(shù)據(jù)打包,虛擬機(jī)處理,文件系統(tǒng)
- 分布式系統(tǒng),數(shù)據(jù)庫代理器
- 網(wǎng)絡(luò)編程,如:Web應(yīng)用、API應(yīng)用、下載應(yīng)用
- 內(nèi)存數(shù)據(jù)庫
- 云平臺(tái),Docker,Kubernetes等應(yīng)用開發(fā)
GO語言的關(guān)鍵特性主要包括以下幾方面:
- 并發(fā)與協(xié)程
- 基于消息傳遞的通信方式
- 豐富實(shí)用的內(nèi)置數(shù)據(jù)類型
- 函數(shù)多返回值
- defer機(jī)制
- 反射(reflect)
- 高性能HTTP Server
- 工程管理
- 編程規(guī)范
Go成功的項(xiàng)目
- Go成功的項(xiàng)目nsq:bitly開源的消息隊(duì)列系統(tǒng),性能非常高,目前他們每天處理數(shù)十億條的消息
- docker:基于lxc的一個(gè)虛擬打包工具,能夠?qū)崿F(xiàn)PAAS平臺(tái)的組建。
- packer:用來生成不同平臺(tái)的鏡像文件,例如VM、vbox、AWS等,作者是vagrant的作者
- skynet:分布式調(diào)度框架
- Doozer:分布式同步工具,類似ZooKeeper
- Heka:mazila開源的日志處理系統(tǒng)
- cbfs:couchbase開源的分布式文件系統(tǒng)
- tsuru:開源的PAAS平臺(tái),和SAE實(shí)現(xiàn)的功能一模一樣
- groupcache:memcahe作者寫的用于Google下載系統(tǒng)的緩存系統(tǒng)
- god:類似redis的緩存系統(tǒng),但是支持分布式和擴(kuò)展性
- gor:網(wǎng)絡(luò)流量抓包和重放工具
碼云上項(xiàng)目
- 1、項(xiàng)目名稱:基于 Go 實(shí)現(xiàn)的高性能代理服務(wù)器,項(xiàng)目地址:https://gitee.com/snail/proxy
- 2、項(xiàng)目名稱:基于 Go 實(shí)現(xiàn)的 Git 服務(wù),項(xiàng)目地址:https://gitee.com/Unknown/gogs
- 3、項(xiàng)目名稱:基于 Go 開發(fā)的開源文庫系統(tǒng),項(xiàng)目地址:https://gitee.com/truthhun/DocHub
- 4、項(xiàng)目名稱:基于 Go 實(shí)現(xiàn)的內(nèi)網(wǎng)穿透 ,項(xiàng)目地址:https://gitee.com/wapai/chuantou
- 5、項(xiàng)目名稱:基于 Go 實(shí)現(xiàn)的 Web 開發(fā)框架,項(xiàng)目地址:https://gitee.com/johng/gf
- 6、項(xiàng)目名稱:基于 Go 實(shí)現(xiàn)的高性能爬蟲,基于go_spider開發(fā)
接下來介紹下關(guān)于Go的并發(fā)相關(guān)的內(nèi)容
Go 調(diào)度器實(shí)現(xiàn)機(jī)制
Go 調(diào)度器模型我們通常叫做G-P-M 模型,他包括 4 個(gè)重要結(jié)構(gòu),分別是G、P、M、Sched:
G:Goroutine,每個(gè) Goroutine 對(duì)應(yīng)一個(gè) G 結(jié)構(gòu)體,G 存儲(chǔ) Goroutine 的運(yùn)行堆棧、狀態(tài)以及任務(wù)函數(shù),可重用。
G 并非執(zhí)行體,每個(gè) G 需要綁定到 P 才能被調(diào)度執(zhí)行。
P: Processor,表示邏輯處理器,對(duì) G 來說,P 相當(dāng)于 CPU 核,G 只有綁定到 P 才能被調(diào)度。
對(duì) M 來說,P 提供了相關(guān)的執(zhí)行環(huán)境(Context),如內(nèi)存分配狀態(tài)(mcache),任務(wù)隊(duì)列(G)等。
P 的數(shù)量決定了系統(tǒng)內(nèi)最大可并行的 G 的數(shù)量(前提:物理 CPU 核數(shù) >= P 的數(shù)量)。
P 的數(shù)量由用戶設(shè)置的 GoMAXPROCS 決定,但是不論 GoMAXPROCS 設(shè)置為多大,P 的數(shù)量最大為 256。
M: Machine,OS 內(nèi)核線程抽象,代表著真正執(zhí)行計(jì)算的資源,在綁定有效的 P 后,進(jìn)入 schedule 循環(huán);
而 schedule 循環(huán)的機(jī)制大致是從 Global 隊(duì)列、P 的 Local 隊(duì)列以及 wait 隊(duì)列中獲取。
M 的數(shù)量是不定的,由 Go Runtime 調(diào)整,為了防止創(chuàng)建過多 OS 線程導(dǎo)致系統(tǒng)調(diào)度不過來,目前默認(rèn)最大限制為 10000 個(gè)。
M 并不保留 G 狀態(tài),這是 G 可以跨 M 調(diào)度的基礎(chǔ)。文章來源:http://www.zghlxwxcb.cn/news/detail-811366.html
Sched:Go 調(diào)度器,它維護(hù)有存儲(chǔ) M 和 G 的隊(duì)列以及調(diào)度器的一些狀態(tài)信息等。
調(diào)度器循環(huán)的機(jī)制大致是從各種隊(duì)列、P 的本地隊(duì)列中獲取 G,切換到 G 的執(zhí)行棧上并執(zhí)行 G 的函數(shù),調(diào)用 Goexit 做清理工作并回到 M,如此反復(fù)。文章來源地址http://www.zghlxwxcb.cn/news/detail-811366.html
到了這里,關(guān)于Go語言并發(fā)模式視角思考的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!