一、Goroutine介紹
基本原理
goroutine 是 Go 運行時(Runtime)管理的??用戶態線程。與線程相比,其初始棧空間僅約 2KB,創建和切換的開銷更低,能夠同時運行大量并發任務。
創建goroutine的方法非常簡單,在將要調用的函數前加入go關鍵字即可。
func hello() {fmt.Println("Hello")
}func main() {go hello() // 創建一個goroutine執行hello()fmt.Println("main goroutine done")
}
WaitGroup
go語言中可以通過sync.WaitGroup實現同步,使主程序等待goroutine執行完畢再進行后續邏輯,基本實現方式如下所示:
func hello() {fmt.Println("Hello")
}func main() {wg := &sync.WaitGroup{}wg.Add(1)go func() {defer wg.Done()hello()}(wg) // 創建一個goroutine執行hello()fmt.Println("main goroutine done")
}
最大并發數限制
可以通過多種方式限制最大并發數,比如帶緩沖的通道、sync/semaphore包等,本文只討論較為簡單的方式:帶緩沖的通道。其基本原理是將緩沖大小作為最大并發數,goroutine執行前向cha