為什么使用 Go 并發(fā)編程?
1.介紹
所謂“并發(fā)編程”,就是在程序中使用并發(fā)。不管是作為客戶(hù)端,調(diào)用接口,還是作為服務(wù)端,處理客戶(hù)端請(qǐng)求,并發(fā)處理,都可以提升程序的性能。
不同的編程語(yǔ)言,實(shí)現(xiàn)并發(fā)的方式不同,單進(jìn)程單線(xiàn)程語(yǔ)言,可以通過(guò)啟動(dòng)多個(gè)進(jìn)程,實(shí)現(xiàn)并發(fā),該方式的問(wèn)題是進(jìn)程之間通信比較復(fù)雜,并且占用資源高;單進(jìn)程多線(xiàn)程語(yǔ)言,可以通過(guò)多線(xiàn)程,實(shí)現(xiàn)并發(fā),該方式的問(wèn)題是線(xiàn)程之間切換成本較高,比較耗費(fèi) CPU。
而 Go 語(yǔ)言實(shí)現(xiàn)并發(fā)相對(duì)來(lái)講,比較簡(jiǎn)單,只需在函數(shù)或方法之前,使用 go 關(guān)鍵字,即可啟動(dòng)一個(gè) goroutine,執(zhí)行該函數(shù)或方法,并且占用資源低,goroutine 與線(xiàn)程不同,它是在用戶(hù)態(tài)。 Go 語(yǔ)言中的 goroutine 以隊(duì)列的形式,由 Go 運(yùn)行時(shí)調(diào)度器調(diào)用,調(diào)度器模型是 GPM。
2.Go 并發(fā)編程
我們通過(guò)簡(jiǎn)單示例,介紹一下 Go 怎么實(shí)現(xiàn)并發(fā)編程。
示例代碼:
func main () {
fmt.Println("Hello World!")
go func () {
fmt.Println("goroutine run")
}
time.Sleep(time.Second())
}閱讀上面這段代碼,我們?cè)?nbsp;main 函數(shù)中,使用 go 關(guān)鍵字啟動(dòng)一個(gè) goroutine 執(zhí)行一個(gè)匿名函數(shù),為了確保在 main 函數(shù)退出之前, goroutine 可以執(zhí)行,我們使用 time.Sleep() 延遲 main 函數(shù)退出。
在實(shí)際項(xiàng)目開(kāi)發(fā)中,我們通常會(huì)使用同步原語(yǔ)控制 goroutine 的執(zhí)行,此處為了易于理解,暫時(shí)不引入同步原語(yǔ)。
3.使用 Go 并發(fā)編程的原因
我們?cè)诹私饬瞬l(fā)編程的優(yōu)勢(shì),和使用 Go 語(yǔ)言并發(fā)編程的實(shí)現(xiàn)方式之后,讀者朋友們可能已經(jīng)總結(jié)出使用 Go 并發(fā)編程的原因。
Go 語(yǔ)言實(shí)現(xiàn)并發(fā),僅需在函數(shù)或方法之前,使用關(guān)鍵字 go 即可啟動(dòng)一個(gè) goroutine 執(zhí)行該函數(shù)或方法,并且占用的資源也非常低。
但是,并發(fā)編程也有劣勢(shì),比如會(huì)引入數(shù)據(jù)競(jìng)態(tài)、死鎖等問(wèn)題。而 Go 語(yǔ)言的 sync 包,提供了很多方法來(lái)解決并發(fā)引入的問(wèn)題。另外,還有 channel 和 select、context 也可以解決并發(fā)引入的問(wèn)題。
總體而言,Go 語(yǔ)言相對(duì)其它編程語(yǔ)言而言,編寫(xiě)并發(fā)程序更方便。
4.總結(jié)
本文我們介紹了并發(fā)編程的優(yōu)勢(shì)和劣勢(shì),比較了其它編程語(yǔ)言與 Go 語(yǔ)言在并發(fā)編程上的不同,Go 語(yǔ)言更易用和更輕量,更加適合編寫(xiě)并發(fā)程序。
限于篇幅,本文未詳細(xì)講解 GPM 模型調(diào)度器,感興趣的讀者朋友們,建議自行查找相關(guān)資料,這將有助于更加深入理解 Go 并發(fā)編程。

































