因為go語言層面支持并發,所以面試中經常會問到并發的問題,比如說控制go并發數量的方式有哪些?下面是我個人整理的兩個例子:
func waitGroup() { count := 10 wg := sync.WaitGroup{} for i := 0; i < count; i++ { wg.Add(1) go func(j int) { fmt.Print(j) wg.Done() // 也可使用 wg.Add(-1) }(i) } wg.Wait() }
上面主要用到的是go中sync包下的waitGroup,這也是在工作中比較常見的實現方式,關鍵點就是把握好Add方法的位置,Wait方法則是等待所有的協程執行完畢
func channel() { count := 10 // 最大支持并發 sum := 100 // 任務總數 c := make(chan struct{}, count) // 控制任務并發的chan sc := make(chan struct{}, sum) // 控制任務總數的chan defer close(c) defer close(sc) for i:=0; i<sum;i++{ c <- struct{}{} // 作用類似于waitgroup.Add(1) go func(j int) { fmt.Println(j) <- c // 執行完畢,釋放資源 sc <- struct {}{} // 記錄到執行總數里 }(i) } for i:=sum; i>0;i-- { <- sc } }
上面的例子用到的是go中的channel,利用channel阻塞的特性和帶緩沖的channel來實現控制并發數量,其中sc這個channel是可以去掉的,例子里用只是為了防止主程序退出之后,沒有全部輸出,正常工作中,程序一般都是阻塞式的,所以可以去掉。
以上就是go語言中控制并發數量的方法的詳細內容,更多請關注億速云其它相關文章!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。