日韩无码专区无码一级三级片|91人人爱网站中日韩无码电影|厨房大战丰满熟妇|AV高清无码在线免费观看|另类AV日韩少妇熟女|中文日本大黄一级黄色片|色情在线视频免费|亚洲成人特黄a片|黄片wwwav色图欧美|欧亚乱色一区二区三区

RELATEED CONSULTING
相關咨詢
選擇下列產(chǎn)品馬上在線溝通
服務時間:8:30-17:00
你可能遇到了下面的問題
關閉右側工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營銷解決方案
創(chuàng)新互聯(lián)GO教程:Go語言等待組(sync.WaitGroup)

Go語言中除了可以使用通道(channel)和互斥鎖進行兩個并發(fā)程序間的同步外,還可以使用等待組進行多個任務的同步,等待組可以保證在并發(fā)環(huán)境中完成指定數(shù)量的任務

運城網(wǎng)站制作公司哪家好,找創(chuàng)新互聯(lián)公司!從網(wǎng)頁設計、網(wǎng)站建設、微信開發(fā)、APP開發(fā)、成都響應式網(wǎng)站建設等網(wǎng)站項目制作,到程序開發(fā),運營維護。創(chuàng)新互聯(lián)公司公司2013年成立到現(xiàn)在10年的時間,我們擁有了豐富的建站經(jīng)驗和運維經(jīng)驗,來保證我們的工作的順利進行。專注于網(wǎng)站建設就選創(chuàng)新互聯(lián)公司。

在 sync.WaitGroup(等待組)類型中,每個 sync.WaitGroup 值在內(nèi)部維護著一個計數(shù),此計數(shù)的初始默認值為零。

等待組有下面幾個方法可用,如下表所示。

等待組的方法

方法名 功能
(wg * WaitGroup) Add(delta int) 等待組的計數(shù)器 +1
(wg * WaitGroup) Done() 等待組的計數(shù)器 -1
(wg * WaitGroup) Wait() 當?shù)却M計數(shù)器不等于 0 時阻塞直到變 0。

對于一個可尋址的 sync.WaitGroup 值 wg:

  • 我們可以使用方法調用 wg.Add(delta) 來改變值 wg 維護的計數(shù)。
  • 方法調用 wg.Done() 和 wg.Add(-1) 是完全等價的。
  • 如果一個 wg.Add(delta) 或者 wg.Done() 調用將 wg 維護的計數(shù)更改成一個負數(shù),一個恐慌將產(chǎn)生。
  • 當一個協(xié)程調用了 wg.Wait() 時,
    • 如果此時 wg 維護的計數(shù)為零,則此 wg.Wait() 此操作為一個空操作(noop);
    • 否則(計數(shù)為一個正整數(shù)),此協(xié)程將進入阻塞狀態(tài)。當以后其它某個協(xié)程將此計數(shù)更改至 0 時(一般通過調用 wg.Done()),此協(xié)程將重新進入運行狀態(tài)(即 wg.Wait() 將返回)。

等待組內(nèi)部擁有一個計數(shù)器,計數(shù)器的值可以通過方法調用實現(xiàn)計數(shù)器的增加和減少。當我們添加了 N 個并發(fā)任務進行工作時,就將等待組的計數(shù)器值增加 N。每個任務完成時,這個值減 1。同時,在另外一個 goroutine 中等待這個等待組的計數(shù)器值為 0 時,表示所有任務已經(jīng)完成。

下面的代碼演示了這一過程:

package main

import (
    "fmt"
    "net/http"
    "sync"
)

func main() {

    // 聲明一個等待組
    var wg sync.WaitGroup

    // 準備一系列的網(wǎng)站地址
    var urls = []string{
        "http://www.github.com/",
        "https://www.qiniu.com/",
        "https://www.golangtc.com/",
    }

    // 遍歷這些地址
    for _, url := range urls {

        // 每一個任務開始時, 將等待組增加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)
    }

    // 等待所有的任務完成
    wg.Wait()

    fmt.Println("over")
}

代碼說明如下:

  • 第 12 行,聲明一個等待組,對一組等待任務只需要一個等待組,而不需要每一個任務都使用一個等待組。
  • 第 15 行,準備一系列可訪問的網(wǎng)站地址的字符串切片。
  • 第 22 行,遍歷這些字符串切片。
  • 第 25 行,將等待組的計數(shù)器加1,也就是每一個任務加 1。
  • 第 28 行,將一個匿名函數(shù)開啟并發(fā)。
  • 第 31 行,在匿名函數(shù)結束時會執(zhí)行這一句以表示任務完成。wg.Done() 方法等效于執(zhí)行 wg.Add(-1)。
  • 第 34 行,使用 http 包提供的 Get() 函數(shù)對 url 進行訪問,Get() 函數(shù)會一直阻塞直到網(wǎng)站響應或者超時。
  • 第 37 行,在網(wǎng)站響應和超時后,打印這個網(wǎng)站的地址和可能發(fā)生的錯誤。
  • 第 40 行,這里將 url 通過 goroutine 的參數(shù)進行傳遞,是為了避免 url 變量通過閉包放入匿名函數(shù)后又被修改的問題。
  • 第 44 行,等待所有的網(wǎng)站都響應或者超時后,任務完成,Wait 就會停止阻塞。

當前標題:創(chuàng)新互聯(lián)GO教程:Go語言等待組(sync.WaitGroup)
本文鏈接:http://www.5511xx.com/article/dpgoije.html