亚洲激情专区-91九色丨porny丨老师-久久久久久久女国产乱让韩-国产精品午夜小视频观看

溫馨提示×

溫馨提示×

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

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

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

白沙| 白城市| 泗水县| 静乐县| 徐汇区| 南昌县| 灵川县| 密山市| 大化| 清河县| 三门峡市| 濉溪县| 合江县| 佳木斯市| 普安县| 许昌市| 彭水| 东至县| 白沙| 保定市| 青浦区| 宜春市| 安远县| 昭苏县| 应城市| 连云港市| 乐昌市| 富蕴县| 涞源县| 乐亭县| 房产| 托克逊县| 普宁市| 郧西县| 社旗县| 运城市| 常山县| 琼中| 河南省| 仁化县| 广南县|