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

溫馨提示×

溫馨提示×

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

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

在golang中使用WaitGroup時需要注意哪些事項

發布時間:2021-03-31 15:51:55 來源:億速云 閱讀:243 作者:Leah 欄目:編程語言

在golang中使用WaitGroup時需要注意哪些事項?相信很多沒有經驗的人對此束手無策,為此本文總結了問題出現的原因和解決方法,通過這篇文章希望你能解決這個問題。

前言

WaitGroup在go語言中,用于線程同步,單從字面意思理解,wait等待的意思,group組、團隊的意思,WaitGroup就是指等待一組,等待一個系列執行完成后才會繼續向下執行。Golang 中的 WaitGroup 一直是同步 goroutine 的推薦實踐。自己用了兩年多也沒遇到過什么問題。

直到最近的一天同事扔過來一段奇怪的代碼:

第一個坑

復制代碼 代碼如下:


package main
 
import (
    "log"
 
    "sync"
)
 
func main() {
    wg := sync.WaitGroup{}
 
    for i := 0; i < 5; i++ {
        go func(wg sync.WaitGroup, i int) {
            wg.Add(1)
            log.Printf("i:%d", i)
            wg.Done()
        }(wg, i)
    }
 
    wg.Wait()
 
    log.Println("exit")
}

撇了一眼,覺得沒什么問題。

然而,它的運行結果是這樣:

復制代碼 代碼如下:


2016/11/27 15:12:36 exit
[Finished in 0.7s]

或這樣:

復制代碼 代碼如下:


2016/11/27 15:21:51 i:2
2016/11/27 15:21:51 exit
[Finished in 0.8s]

或這樣:

復制代碼 代碼如下:


2016/11/27 15:22:51 i:3
2016/11/27 15:22:51 i:2
2016/11/27 15:22:51 exit
[Finished in 0.8s]

一度讓我以為手上的 mac 也沒睡醒……

這個問題如果理解了 WaitGroup 的設計目的就非常容易 fix 啦。因為 WaitGroup 同步的是 goroutine, 而上面的代碼卻在 goroutine 中進行 Add(1) 操作。因此,可能在這些 goroutine 還沒來得及 Add(1) 已經執行 Wait 操作了。

于是代碼改成了這樣:

第二個坑

復制代碼 代碼如下:


package main
 
import (
    "log"
 
    "sync"
)
 
func main() {
    wg := sync.WaitGroup{}
 
    for i := 0; i < 5; i++ {
        wg.Add(1)
        go func(wg sync.WaitGroup, i int) {
            log.Printf("i:%d", i)
            wg.Done()
        }(wg, i)
    }
 
    wg.Wait()
 
    log.Println("exit")
}

然而,mac 又睡了過去,而且是睡死了過去:

復制代碼 代碼如下:


2016/11/27 15:25:16 i:1
2016/11/27 15:25:16 i:2
2016/11/27 15:25:16 i:4
2016/11/27 15:25:16 i:0
2016/11/27 15:25:16 i:3
fatal error: all goroutines are asleep - deadlock!

wg 給拷貝傳遞到了 goroutine 中,導致只有 Add 操作,其實 Done操作是在 wg 的副本執行的。因此 Wait 就死鎖了。

于是代碼改成了這樣:

填坑

復制代碼 代碼如下:


package main
 
import (
    "log"
 
    "sync"
)
 
func main() {
    wg := &sync.WaitGroup{}
 
    for i := 0; i < 5; i++ {
        wg.Add(1)
        go func(wg *sync.WaitGroup, i int) {
            log.Printf("i:%d", i)
            wg.Done()
        }(wg, i)
    }
 
    wg.Wait()
 
    log.Println("exit")
}

看完上述內容,你們掌握在golang中使用WaitGroup時需要注意哪些事項的方法了嗎?如果還想學到更多技能或想了解更多相關內容,歡迎關注億速云行業資訊頻道,感謝各位的閱讀!

向AI問一下細節

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

AI

连城县| 荔波县| 长乐市| 武安市| 岢岚县| 太保市| 和田市| 泸溪县| 崇明县| 故城县| 改则县| 扎鲁特旗| 永宁县| 博爱县| 潞城市| 临桂县| 任丘市| 潼南县| 沐川县| 丽江市| 镇安县| 巴楚县| 车致| 灵丘县| 富锦市| 江源县| 梅河口市| 青田县| 金平| 昭通市| 盱眙县| 交口县| 祥云县| 东源县| 读书| 神农架林区| 诸城市| 克什克腾旗| 达日县| 淅川县| 贵德县|