中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Go中的WaitGroup怎么使用

發布時間:2022-04-18 10:18:28 來源:億速云 閱讀:115 作者:iii 欄目:開發技術

今天小編給大家分享一下Go中的WaitGroup怎么使用的相關知識點,內容詳細,邏輯清晰,相信大部分人都還太了解這方面的知識,所以分享這篇文章給大家參考一下,希望大家閱讀完這篇文章后有所收獲,下面我們一起來了解一下吧。

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

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

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

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(協程)之前,先調用Add(),用來設置或添加要等待完成的goroutine(協程)數量

    • 例如Add(2)或者兩次調用Add(1)都會設置等待計數器的值為2,表示要等待2個goroutine(協程)完成

  • Done():每次需要等待的goroutine(協程)在真正完成之前,應該調用該方法來人為表示goroutine(協程)完成了,該方法會對等待計數器減1

  • Wait():在等待計數器減為0之前,Wait()會一直阻塞當前的goroutine(協程)

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

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

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之前,都先調用Add()方法增加一個需要等待的goroutine計數。每個goroutine都運行process()函數,這個函數在執行完成時需要調用Done()方法來表示goroutine的結束。激活3個goroutine后,main goroutine會執行到Wait(),由于每個激活的goroutine運行的process()都需要睡眠2秒,所以main goroutine在Wait()這里會阻塞一段時間(大約2秒),當所有goroutine都完成后,等待計數器減為0,Wait()將不再阻塞,于是main goroutine得以執行后面的Println()。

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

以上就是“Go中的WaitGroup怎么使用”這篇文章的所有內容,感謝各位的閱讀!相信大家閱讀完這篇文章都有很大的收獲,小編每天都會為大家更新不同的知識,如果還想學習更多的知識,請關注億速云行業資訊頻道。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

潼关县| 工布江达县| 吉林省| 儋州市| 芒康县| 县级市| 车险| 临潭县| 鄂州市| 平远县| 皮山县| 黄冈市| 平塘县| 西平县| 鄄城县| 洛阳市| 门源| 洪洞县| 大兴区| 察隅县| 德州市| 察哈| 滨州市| 合水县| 枣庄市| 塘沽区| 东莞市| 保山市| 沁源县| 金门县| 射洪县| 板桥市| 寿宁县| 赤水市| 华池县| 琼结县| 永春县| 沙田区| 古田县| 赫章县| 天津市|