sync.WaitGroup的用法及說明
sync.WaitGroup的用法
WaitGroup在go語言中,用于線程同步,單從字面意思理解,wait等待的意思,group組、團(tuán)隊(duì)的意思,WaitGroup就是指等待一組,等待一個(gè)系列執(zhí)行完成后才會(huì)繼續(xù)向下執(zhí)行。
WaitGroup能夠一直等到所有的goroutine執(zhí)行完成,并且阻塞主線程的執(zhí)行,直到所有的goroutine執(zhí)行完成。
WaitGroup總共有三個(gè)方法
Add(delta int),Done(),Wait()
簡(jiǎn)單的說一下這三個(gè)方法的作用。
Add:添加或者減少等待goroutine的數(shù)量;Done:相當(dāng)于Add(-1);Wait:執(zhí)行阻塞,直到所有的WaitGroup數(shù)量變成 0;
如圖:WatiGroup的定義

google官方示例
package main
import (
"fmt"
"sync"
"net/http"
)
func main() {
var wg sync.WaitGroup
var urls = []string{
"http://www.golang.org/",
"http://www.google.com/",
"http://www.baiyuxiong.com/",
}
for _, url := range urls {
// Increment the WaitGroup counter.
wg.Add(1)
// Launch a goroutine to fetch the URL.
go func(url string) {
// Decrement the counter when the goroutine completes.
defer wg.Done()
// Fetch the URL.
http.Get(url)
fmt.Println(url);
}(url)
}
// Wait for all HTTP fetches to complete.
wg.Wait()
fmt.Println("over");
}
代碼執(zhí)行結(jié)果為:
http://www.baiyuxiong.com/ http://www.google.com/ http://www.golang.org/ over
從執(zhí)行結(jié)果可看出:
1、取三個(gè)網(wǎng)址信息的時(shí)候,結(jié)果顯示順序與for循環(huán)的順序沒有必然關(guān)系。
2、三個(gè)goroutine全部執(zhí)行完成后,wg.Wait()才停止等待,繼續(xù)執(zhí)行并打印出over字符。
總結(jié)
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
Golan中?new()?、?make()?和簡(jiǎn)短聲明符的區(qū)別和使用
Go語言中的new()、make()和簡(jiǎn)短聲明符的區(qū)別和使用,new()用于分配內(nèi)存并返回指針,make()用于初始化切片、映射和通道,并返回初始化后的對(duì)象,簡(jiǎn)短聲明符:=可以簡(jiǎn)化變量聲明和初始化過程,感興趣的朋友一起看看吧2025-01-01
詳解golang中make與new的異同點(diǎn)和用法
這篇文章將給大家介紹了go語言中函數(shù)new與make的使用和區(qū)別,關(guān)于go語言中new和make是內(nèi)建的兩個(gè)函數(shù),主要用來創(chuàng)建分配類型內(nèi)存,文中通過代碼示例介紹的非常詳細(xì),具有一定的參考價(jià)值,需要的朋友可以參考下2024-01-01
Golang設(shè)計(jì)模式之適配器模式介紹和代碼示例
適配器是一種結(jié)構(gòu)型設(shè)計(jì)模式, 它能使不兼容的對(duì)象能夠相互合作,可擔(dān)任兩個(gè)對(duì)象間的封裝器, 它會(huì)接收對(duì)于一個(gè)對(duì)象的調(diào)用, 并將其轉(zhuǎn)換為另一個(gè)對(duì)象可識(shí)別的格式和接口,本文將通過代碼示例詳細(xì)給大家介紹Golang的適配器模式2023-06-06
Go Mongox輕松實(shí)現(xiàn)MongoDB的時(shí)間字段自動(dòng)填充
這篇文章主要為大家詳細(xì)介紹了Go語言如何使用 mongox 庫,在插入和更新數(shù)據(jù)時(shí)自動(dòng)填充時(shí)間字段,從而提升開發(fā)效率并減少重復(fù)代碼,需要的可以參考下2025-02-02
GoLang channel底層代碼實(shí)現(xiàn)詳解
Channel和goroutine的結(jié)合是Go并發(fā)編程的大殺器。而Channel的實(shí)際應(yīng)用也經(jīng)常讓人眼前一亮,通過與select,cancel,timer等結(jié)合,它能實(shí)現(xiàn)各種各樣的功能。接下來,我們就要梳理一下GoLang channel底層代碼實(shí)現(xiàn)2022-10-10
使用Gorm操作Oracle數(shù)據(jù)庫踩坑記錄
gorm是目前用得最多的go語言orm庫,本文主要介紹了使用Gorm操作Oracle數(shù)據(jù)庫踩坑記錄,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2022-06-06

