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ù)開(kāi)始前, 增加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是開(kāi)箱即用的,并且是并發(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ǔ)言支付寶沙箱對(duì)接的實(shí)現(xiàn)
本文介紹了如何使用GO語(yǔ)言對(duì)接支付寶沙箱環(huán)境,包括秘鑰生成、SDK安裝和代碼實(shí)現(xiàn)等步驟,詳細(xì)內(nèi)容涵蓋了從秘鑰生成到前端代碼的每個(gè)階段,為開(kāi)發(fā)者提供了一條清晰的指引2024-09-09
golang協(xié)程關(guān)閉踩坑實(shí)戰(zhàn)記錄
協(xié)程(coroutine)是Go語(yǔ)言中的輕量級(jí)線程實(shí)現(xiàn),下面這篇文章主要給大家介紹了關(guān)于golang協(xié)程關(guān)閉踩坑的相關(guān)資料,文中通過(guò)實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下2023-03-03
golang抓取網(wǎng)頁(yè)并分析頁(yè)面包含的鏈接方法
今天小編就為大家分享一篇golang抓取網(wǎng)頁(yè)并分析頁(yè)面包含的鏈接方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2019-08-08
Go中并發(fā)控制的實(shí)現(xiàn)方式總結(jié)
在Go實(shí)際開(kāi)發(fā)中,并發(fā)安全是老生常談的事情,在并發(fā)下,goroutine之間的存在數(shù)據(jù)資源等方面的競(jìng)爭(zhēng),為了保證數(shù)據(jù)一致性、防止死鎖等問(wèn)題的出現(xiàn),在并發(fā)中需要使用一些方式來(lái)實(shí)現(xiàn)并發(fā)控制,本文給大家總結(jié)了幾種實(shí)現(xiàn)方式,需要的朋友可以參考下2023-12-12
使用Go語(yǔ)言開(kāi)發(fā)自動(dòng)化API測(cè)試工具詳解
這篇文章主要為大家詳細(xì)介紹了如何使用Go語(yǔ)言開(kāi)發(fā)自動(dòng)化API測(cè)試工具,文中的示例代碼講解詳細(xì),具有一定的借鑒價(jià)值,有需要的小伙伴可以參考下2024-03-03
Go語(yǔ)言定時(shí)任務(wù)的實(shí)現(xiàn)示例
本文主要介紹了Go語(yǔ)言定時(shí)任務(wù)的實(shí)現(xiàn)示例,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2023-05-05
Go語(yǔ)言基礎(chǔ)for循環(huán)語(yǔ)句的用法及示例詳解
這篇文章主要為大家介紹了Go語(yǔ)言基礎(chǔ)for循環(huán)語(yǔ)句的用法及示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步2021-11-11

