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