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

Go基礎(chǔ)教程系列之WaitGroup用法實例詳解

 更新時間:2022年04月18日 09:08:10   作者:駿馬金龍  
這篇文章主要介紹了Go基礎(chǔ)教程系列之WaitGroup用法實例詳解,需要的朋友可以參考下

正常情況下,新激活的goroutine(協(xié)程)的結(jié)束過程是不可控制的,唯一可以保證終止goroutine(協(xié)程)的行為是main goroutine(協(xié)程)的終止。也就是說,我們并不知道哪個goroutine(協(xié)程)什么時候結(jié)束。

但很多情況下,我們正需要知道goroutine(協(xié)程)是否完成。這需要借助sync包的WaitGroup來實現(xiàn)。

WatiGroup是sync包中的一個struct類型,用來收集需要等待執(zhí)行完成的goroutine(協(xié)程)。下面是它的定義:

type WaitGroup struct {
        // Has unexported fields.
}
    A WaitGroup waits for a collection of goroutines to finish. The main
    goroutine calls Add to set the number of goroutines to wait for. Then each
    of the goroutines runs and calls Done when finished. At the same time, Wait
    can be used to block until all goroutines have finished.

    A WaitGroup must not be copied after first use.


func (wg *WaitGroup) Add(delta int)
func (wg *WaitGroup) Done()
func (wg *WaitGroup) Wait()

它有3個方法:

  • Add():每次激活想要被等待完成的goroutine(協(xié)程)之前,先調(diào)用Add(),用來設(shè)置或添加要等待完成的goroutine(協(xié)程)數(shù)量
    • 例如Add(2)或者兩次調(diào)用Add(1)都會設(shè)置等待計數(shù)器的值為2,表示要等待2個goroutine(協(xié)程)完成
  • Done():每次需要等待的goroutine(協(xié)程)在真正完成之前,應(yīng)該調(diào)用該方法來人為表示goroutine(協(xié)程)完成了,該方法會對等待計數(shù)器減1
  • Wait():在等待計數(shù)器減為0之前,Wait()會一直阻塞當前的goroutine(協(xié)程)

也就是說,Add()用來增加要等待的goroutine(協(xié)程)的數(shù)量,Done()用來表示goroutine(協(xié)程)已經(jīng)完成了,減少一次計數(shù)器,Wait()用來等待所有需要等待的goroutine(協(xié)程)完成。

下面是一個示例,通過示例很容易理解。

package main

import (  
    "fmt"
    "sync"
    "time"
)

func process(i int, wg *sync.WaitGroup) {  
    fmt.Println("started Goroutine ", i)
    time.Sleep(2 * time.Second)
    fmt.Printf("Goroutine %d ended\n", i)
    wg.Done()
}

func main() {  
    no := 3
    var wg sync.WaitGroup
    for i := 0; i < no; i++ {
        wg.Add(1)
        go process(i, &wg)
    }
    wg.Wait()
    fmt.Println("All go routines finished executing")
}

上面激活了3個goroutine,每次激活goroutine之前,都先調(diào)用Add()方法增加一個需要等待的goroutine計數(shù)。每個goroutine都運行process()函數(shù),這個函數(shù)在執(zhí)行完成時需要調(diào)用Done()方法來表示goroutine的結(jié)束。激活3個goroutine后,main goroutine會執(zhí)行到Wait(),由于每個激活的goroutine運行的process()都需要睡眠2秒,所以main goroutine在Wait()這里會阻塞一段時間(大約2秒),當所有g(shù)oroutine都完成后,等待計數(shù)器減為0,Wait()將不再阻塞,于是main goroutine得以執(zhí)行后面的Println()。

還有一點需要特別注意的是process()中使用指針類型的*sync.WaitGroup作為參數(shù),這里不能使用值類型的sync.WaitGroup作為參數(shù),因為這意味著每個goroutine都拷貝一份wg,每個goroutine都使用自己的wg。這顯然是不合理的,這3個goroutine應(yīng)該共享一個wg,才能知道這3個goroutine都完成了。實際上,如果使用值類型的參數(shù),main goroutine將會永久阻塞而導(dǎo)致產(chǎn)生死鎖。

更多關(guān)于Go WaitGroup用法教程請查看下面的相關(guān)鏈接

相關(guān)文章

  • Goland激活碼破解永久版及安裝詳細教程(親測可以)

    Goland激活碼破解永久版及安裝詳細教程(親測可以)

    這篇文章主要介紹了Goland激活碼破解永久版及安裝詳細教程(親測可以),本文通過實例圖文相結(jié)合給大家介紹的非常詳細,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-10-10
  • Go語言學(xué)習(xí)之接口類型(interface)詳解

    Go語言學(xué)習(xí)之接口類型(interface)詳解

    接口是用來定義行為的類型,定義的行為不由接口直接實現(xiàn),而由通過方法由定義的類型實現(xiàn),本文就來和大家詳細講講Go語言中接口的使用吧
    2023-03-03
  • Golang中如何使用lua進行擴展詳解

    Golang中如何使用lua進行擴展詳解

    這篇文章主要給大家介紹了關(guān)于Golang中如何使用lua進行擴展的相關(guān)資料,這是最近在工作中遇到的一個問題,覺著有必要分享出來給大家學(xué)習(xí),文中給出了詳細的示例,需要的朋友可以參考借鑒,下面來一起看看吧。
    2017-10-10
  • Go語言基礎(chǔ)學(xué)習(xí)之map的示例詳解

    Go語言基礎(chǔ)學(xué)習(xí)之map的示例詳解

    哈希表是常見的數(shù)據(jù)結(jié)構(gòu),有的語言會將哈希稱作字典或者映射,在Go中,哈希就是常見的數(shù)據(jù)類型map,本文就來聊聊Golang中map的相關(guān)知識吧
    2023-04-04
  • 輕松構(gòu)建Go應(yīng)用的Dockerfile

    輕松構(gòu)建Go應(yīng)用的Dockerfile

    本文介紹了如何制作一個用于構(gòu)建和運行Go應(yīng)用程序的Docker鏡像的Dockerfile的相關(guān)資料,需要的朋友可以參考下
    2023-10-10
  • 淺析go中Ticker,Timer和Tick的用法與區(qū)別

    淺析go中Ticker,Timer和Tick的用法與區(qū)別

    在go面試的時候,面試官經(jīng)常會問time包的Ticker,Timer以及Tick的區(qū)別,一般在超時控制的時候用的比較多,今天就跟隨小編一起來詳細學(xué)一下這幾個的區(qū)別吧
    2023-10-10
  • Go結(jié)構(gòu)體從基礎(chǔ)到應(yīng)用深度探索

    Go結(jié)構(gòu)體從基礎(chǔ)到應(yīng)用深度探索

    本文深入探討了結(jié)構(gòu)體的定義、類型、字面量表示和使用方法,旨在為讀者呈現(xiàn)Go結(jié)構(gòu)體的全面視角,通過結(jié)構(gòu)體,開發(fā)者可以實現(xiàn)更加模塊化、高效的代碼設(shè)計,這篇文章旨在為您提供關(guān)于結(jié)構(gòu)體的深入理解,助您更好地利用Go語言的強大功能
    2023-10-10
  • Go語言常用字符串處理方法實例匯總

    Go語言常用字符串處理方法實例匯總

    這篇文章主要介紹了Go語言常用字符串處理方法,實例匯總了Go語言中常見的各種字符串處理技巧,具有一定參考借鑒價值,需要的朋友可以參考下
    2015-03-03
  • go語言使用RC4加密的方法

    go語言使用RC4加密的方法

    這篇文章主要介紹了go語言使用RC4加密的方法,實例分析了RC4加密的技巧與實現(xiàn)方法,具有一定參考借鑒價值,需要的朋友可以參考下
    2015-03-03
  • 詳解Golang的GC三色標記法

    詳解Golang的GC三色標記法

    這篇文章主要為大家介紹了Golang的GC三色標記法,文中有詳細的實現(xiàn)過程供大家參考,對大家的學(xué)習(xí)或工作有一定幫助,感興趣的可以跟著小編一來看看
    2023-05-05

最新評論