掃二維碼與項目經(jīng)理溝通
我們在微信上24小時期待你的聲音
解答本文疑問/技術(shù)咨詢/運營咨詢/技術(shù)建議/互聯(lián)網(wǎng)交流
Go語言中除了可以使用通道(channel)和互斥鎖進(jìn)行兩個并發(fā)程序間的同步外,還可以使用等待組進(jìn)行多個任務(wù)的同步,等待組可以保證在并發(fā)環(huán)境中完成指定數(shù)量的任務(wù)

運城網(wǎng)站制作公司哪家好,找創(chuàng)新互聯(lián)公司!從網(wǎng)頁設(shè)計、網(wǎng)站建設(shè)、微信開發(fā)、APP開發(fā)、成都響應(yīng)式網(wǎng)站建設(shè)等網(wǎng)站項目制作,到程序開發(fā),運營維護(hù)。創(chuàng)新互聯(lián)公司公司2013年成立到現(xiàn)在10年的時間,我們擁有了豐富的建站經(jīng)驗和運維經(jīng)驗,來保證我們的工作的順利進(jìn)行。專注于網(wǎng)站建設(shè)就選創(chuàng)新互聯(lián)公司。
在 sync.WaitGroup(等待組)類型中,每個 sync.WaitGroup 值在內(nèi)部維護(hù)著一個計數(shù),此計數(shù)的初始默認(rèn)值為零。
等待組有下面幾個方法可用,如下表所示。
| 方法名 | 功能 |
|---|---|
| (wg * WaitGroup) Add(delta int) | 等待組的計數(shù)器 +1 |
| (wg * WaitGroup) Done() | 等待組的計數(shù)器 -1 |
| (wg * WaitGroup) Wait() | 當(dāng)?shù)却M計數(shù)器不等于 0 時阻塞直到變 0。 |
對于一個可尋址的 sync.WaitGroup 值 wg:
等待組內(nèi)部擁有一個計數(shù)器,計數(shù)器的值可以通過方法調(diào)用實現(xiàn)計數(shù)器的增加和減少。當(dāng)我們添加了 N 個并發(fā)任務(wù)進(jìn)行工作時,就將等待組的計數(shù)器值增加 N。每個任務(wù)完成時,這個值減 1。同時,在另外一個 goroutine 中等待這個等待組的計數(shù)器值為 0 時,表示所有任務(wù)已經(jīng)完成。
下面的代碼演示了這一過程:
package main
import (
"fmt"
"net/http"
"sync"
)
func main() {
// 聲明一個等待組
var wg sync.WaitGroup
// 準(zhǔn)備一系列的網(wǎng)站地址
var urls = []string{
"http://www.github.com/",
"https://www.qiniu.com/",
"https://www.golangtc.com/",
}
// 遍歷這些地址
for _, url := range urls {
// 每一個任務(wù)開始時, 將等待組增加1
wg.Add(1)
// 開啟一個并發(fā)
go func(url string) {
// 使用defer, 表示函數(shù)完成時將等待組值減1
defer wg.Done()
// 使用http訪問提供的地址
_, err := http.Get(url)
// 訪問完成后, 打印地址和可能發(fā)生的錯誤
fmt.Println(url, err)
// 通過參數(shù)傳遞url地址
}(url)
}
// 等待所有的任務(wù)完成
wg.Wait()
fmt.Println("over")
}代碼說明如下:

我們在微信上24小時期待你的聲音
解答本文疑問/技術(shù)咨詢/運營咨詢/技術(shù)建議/互聯(lián)網(wǎng)交流