Golang中的同步工具sync.WaitGroup詳解
sync.WaitGroup
sync.WaitGroup作用是等待一組goroutine執(zhí)行完成,當(dāng)使用多個(gè)goroutine處理任務(wù)的時(shí)候,如果要等待所有的goroutine都執(zhí)行完成后再執(zhí)行下一步操作,就可以使用sync.WaitGroup來(lái)實(shí)現(xiàn)。
sync.WaitGroup有三個(gè)方法:
- Add(delta int):增加或減少等待goroutine的數(shù)量,delta可以為負(fù)數(shù);
- Done():標(biāo)記goroutine已執(zhí)行完成,等價(jià)于Add(-1);
- Wait():等待所有的goroutine執(zhí)行完成。
使用方法和示例
假如有n個(gè)任務(wù)需要處理,可以先創(chuàng)建一個(gè)WaitGroup,用于等待所有的任務(wù)完成:
var wg sync.WaitGroup
在處理每一個(gè)任務(wù)之前,調(diào)用一次Add方法:
wg.Add(1)
在每一個(gè)任務(wù)處理完成之后,調(diào)用一次Done方法:
wg.Done()
最后,在等待所有的任務(wù)完成之前,需要調(diào)用一次Wait方法:
wg.Wait()
具體示例代碼如下:
package main import ( "log" "sync" "time" ) func main() { // 創(chuàng)建一個(gè)等待組 var wg sync.WaitGroup for i := 1; i <= 5; i++ { // 每一個(gè)任務(wù)開始前, 增加1 wg.Add(1) go func(index int) { // 處理業(yè)務(wù)邏輯 //... time.Sleep(1 * time.Second) log.Printf("第 %d 個(gè)goroutine執(zhí)行完了", index) wg.Done() }(i) } // 等待所有的任務(wù)完成 wg.Wait() log.Println("所有g(shù)oroutine都執(zhí)行完了") }
使用過(guò)程中需要注意的點(diǎn)
Done和Add方法的順序非常重要,Done方法必須在goroutine最后執(zhí)行,否則可能會(huì)導(dǎo)致計(jì)數(shù)器無(wú)法正確的達(dá)到0;
如果使用Add或Done方法將wg維護(hù)的計(jì)數(shù)更改成了負(fù)數(shù)會(huì)導(dǎo)致panic;
Wait方法會(huì)一直阻塞,直到所有的goroutine都執(zhí)行完成為止(wg維護(hù)的計(jì)數(shù)達(dá)到0),因此在使用時(shí)需要小心;
sync.WaitGroup是開箱即用的,并且是并發(fā)安全的。
到此這篇關(guān)于Golang中的同步工具sync.WaitGroup詳解的文章就介紹到這了,更多相關(guān)Golang同步工具sync.WaitGroup內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- Golang中的sync.WaitGroup用法實(shí)例
- 在golang中使用Sync.WaitGroup解決等待的問(wèn)題
- Go并發(fā):使用sync.WaitGroup實(shí)現(xiàn)協(xié)程同步方式
- Go語(yǔ)言同步等待組sync.WaitGroup結(jié)構(gòu)體對(duì)象方法詳解
- GoLang的sync.WaitGroup與sync.Once簡(jiǎn)單使用講解
- 從并發(fā)到并行解析Go語(yǔ)言中的sync.WaitGroup
- Go語(yǔ)言動(dòng)態(tài)并發(fā)控制sync.WaitGroup的靈活運(yùn)用示例詳解
- 深入理解go sync.Waitgroup的使用
相關(guān)文章
Go語(yǔ)言學(xué)習(xí)技巧之命名規(guī)范
最近在學(xué)習(xí)go語(yǔ)言,發(fā)現(xiàn)了不少需要整理的知識(shí)點(diǎn),所以整理下分享出來(lái),下面這篇文章主要給大家介紹了關(guān)于Go語(yǔ)言學(xué)習(xí)技巧之命名規(guī)范的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),需要的朋友可以參考借鑒,下面來(lái)一起看看吧。2017-12-12Go切片擴(kuò)容機(jī)制詳細(xì)說(shuō)明和舉例
Go 語(yǔ)言中的切片是一種動(dòng)態(tài)數(shù)組,它可以自動(dòng)擴(kuò)容和縮容以適應(yīng)不同的數(shù)據(jù)量,這篇文章主要給大家介紹了關(guān)于Go切片擴(kuò)容機(jī)制詳細(xì)說(shuō)明和舉例的相關(guān)資料,文中通過(guò)代碼介紹的非常詳細(xì),需要的朋友可以參考下2024-03-03golang常用庫(kù)之配置文件解析庫(kù)-viper使用詳解
viper 配置管理解析庫(kù),是由大神 Steve Francia 開發(fā),他在google領(lǐng)導(dǎo)著 golang 的產(chǎn)品開發(fā),他也是 gohugo.io 的創(chuàng)始人之一,命令行解析庫(kù) cobra 開發(fā)者,這篇文章主要介紹了golang常用庫(kù)之配置文件解析庫(kù)-viper使用詳解,需要的朋友可以參考下2020-10-10golang如何實(shí)現(xiàn)三元運(yùn)算符功能
這篇文章主要介紹了在其他一些編程語(yǔ)言中,如?C?語(yǔ)言,三元運(yùn)算符是一種可以用一行代碼實(shí)現(xiàn)條件選擇的簡(jiǎn)便方法,那么在Go語(yǔ)言中如何實(shí)現(xiàn)類似功能呢,下面就跟隨小編一起學(xué)習(xí)一下吧2024-02-02Golang正則表達(dá)式判斷手機(jī)號(hào)或身份證方法實(shí)例
日常使用一些軟件時(shí)會(huì)通過(guò)手機(jī)號(hào)碼來(lái)注冊(cè),這就會(huì)用到正則表達(dá)式來(lái)判斷號(hào)碼是否正確,下面這篇文章主要給大家介紹了關(guān)于Golang正則表達(dá)式判斷手機(jī)號(hào)或身份證的相關(guān)資料,需要的朋友可以參考下2022-07-07Go語(yǔ)言中Timer計(jì)時(shí)器的使用技巧詳解
Go語(yǔ)言中的time包里有個(gè)Timer計(jì)時(shí)器的功能,這篇文章主要就是來(lái)和大家介紹一下Timer計(jì)時(shí)器的使用技巧,感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下2023-07-07