欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Golang中的同步工具sync.WaitGroup詳解

 更新時(shí)間:2023年05月16日 09:42:53   作者:路多辛  
這篇文章主要詳細(xì)為大家介紹了Golang中的同步工具sync.WaitGroup,文中有詳細(xì)的代碼示例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,一起跟隨小編過(guò)來(lái)看看吧

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)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 詳解Golang中的各種時(shí)間操作

    詳解Golang中的各種時(shí)間操作

    這篇文章主要介紹了詳解Golang中的各種時(shí)間操作,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2020-10-10
  • Go語(yǔ)言學(xué)習(xí)技巧之命名規(guī)范

    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-12
  • Go切片擴(kuò)容機(jī)制詳細(xì)說(shuō)明和舉例

    Go切片擴(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-03
  • golang常用庫(kù)之配置文件解析庫(kù)-viper使用詳解

    golang常用庫(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-10
  • golang如何實(shí)現(xiàn)三元運(yùn)算符功能

    golang如何實(shí)現(xiàn)三元運(yùn)算符功能

    這篇文章主要介紹了在其他一些編程語(yǔ)言中,如?C?語(yǔ)言,三元運(yùn)算符是一種可以用一行代碼實(shí)現(xiàn)條件選擇的簡(jiǎn)便方法,那么在Go語(yǔ)言中如何實(shí)現(xiàn)類似功能呢,下面就跟隨小編一起學(xué)習(xí)一下吧
    2024-02-02
  • Golang正則表達(dá)式判斷手機(jī)號(hào)或身份證方法實(shí)例

    Golang正則表達(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-07
  • Go語(yǔ)言中的字符串拼接方法詳情

    Go語(yǔ)言中的字符串拼接方法詳情

    本文介紹Go語(yǔ)言中的string類型、strings包和bytes.Buffer類型,介紹幾種字符串拼接方法的相關(guān)資料,需要的朋友可以參考一下,希望對(duì)你有所幫助
    2021-10-10
  • 解析Go?中的?rune?類型

    解析Go?中的?rune?類型

    rune類型是?Go?語(yǔ)言的一種特殊數(shù)字類型,Go?語(yǔ)言通過(guò)rune處理中文,支持國(guó)際化多語(yǔ)言,本文給大家介紹Go?中的?rune?類型,感興趣的朋友一起看看吧
    2022-03-03
  • Go語(yǔ)言中Timer計(jì)時(shí)器的使用技巧詳解

    Go語(yǔ)言中Timer計(jì)時(shí)器的使用技巧詳解

    Go語(yǔ)言中的time包里有個(gè)Timer計(jì)時(shí)器的功能,這篇文章主要就是來(lái)和大家介紹一下Timer計(jì)時(shí)器的使用技巧,感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下
    2023-07-07
  • Go 驗(yàn)證字符串中是否包含中文(推薦)

    Go 驗(yàn)證字符串中是否包含中文(推薦)

    這篇文章主要介紹了Go 驗(yàn)證字符串中是否包含中文,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-01-01

最新評(píng)論