国产片侵犯亲女视频播放_亚洲精品二区_在线免费国产视频_欧美精品一区二区三区在线_少妇久久久_在线观看av不卡

腳本之家,腳本語(yǔ)言編程技術(shù)及教程分享平臺(tái)!
分類(lèi)導(dǎo)航

Python|VBS|Ruby|Lua|perl|VBA|Golang|PowerShell|Erlang|autoit|Dos|bat|

服務(wù)器之家 - 腳本之家 - Golang - Go語(yǔ)言WaitGroup使用時(shí)需要注意的坑

Go語(yǔ)言WaitGroup使用時(shí)需要注意的坑

2020-05-04 13:39daisy Golang

Go語(yǔ)言中WaitGroup的用途是它能夠一直等到所有的goroutine執(zhí)行完成,并且阻塞主線程的執(zhí)行,直到所有的goroutine執(zhí)行完成。之前一直使用也沒(méi)有問(wèn)題,但最近通過(guò)同事的一段代碼引起了關(guān)于WaitGroup的注意,下面這篇文章就介紹了WaitG

前言

WaitGroup在go語(yǔ)言中,用于線程同步,單從字面意思理解,wait等待的意思,group組、團(tuán)隊(duì)的意思,WaitGroup就是指等待一組,等待一個(gè)系列執(zhí)行完成后才會(huì)繼續(xù)向下執(zhí)行。Golang 中的 WaitGroup 一直是同步 goroutine 的推薦實(shí)踐。自己用了兩年多也沒(méi)遇到過(guò)什么問(wèn)題。

直到最近的一天同事扔過(guò)來(lái)一段奇怪的代碼:

第一個(gè)坑

 

復(fù)制代碼 代碼如下:

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")
}

 

撇了一眼,覺(jué)得沒(méi)什么問(wèn)題。

然而,它的運(yùn)行結(jié)果是這樣:

 

復(fù)制代碼 代碼如下:

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

 

或這樣:

 

復(fù)制代碼 代碼如下:

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

 

或這樣:

 

復(fù)制代碼 代碼如下:

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 也沒(méi)睡醒……

這個(gè)問(wèn)題如果理解了 WaitGroup 的設(shè)計(jì)目的就非常容易 fix 啦。因?yàn)?WaitGroup 同步的是 goroutine, 而上面的代碼卻在 goroutine 中進(jìn)行 Add(1) 操作。因此,可能在這些 goroutine 還沒(méi)來(lái)得及 Add(1) 已經(jīng)執(zhí)行 Wait 操作了。

于是代碼改成了這樣:

第二個(gè)坑

 

復(fù)制代碼 代碼如下:

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 又睡了過(guò)去,而且是睡死了過(guò)去:

 

復(fù)制代碼 代碼如下:

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 中,導(dǎo)致只有 Add 操作,其實(shí) Done操作是在 wg 的副本執(zhí)行的。因此 Wait 就死鎖了。

于是代碼改成了這樣:

填坑

 

復(fù)制代碼 代碼如下:

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")
}
 

 

總結(jié)

好了,到這里終于解決了,以上就是關(guān)于Go語(yǔ)言WaitGroup使用時(shí)需要注意的一些坑,希望本文中提到的這些問(wèn)題對(duì)大家學(xué)習(xí)或者使用Go語(yǔ)言的時(shí)候能有所幫助,如果有疑問(wèn)大家可以留言交流。

延伸 · 閱讀

精彩推薦
  • Golanggolang的httpserver優(yōu)雅重啟方法詳解

    golang的httpserver優(yōu)雅重啟方法詳解

    這篇文章主要給大家介紹了關(guān)于golang的httpserver優(yōu)雅重啟的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,...

    helight2992020-05-14
  • Golanggo日志系統(tǒng)logrus顯示文件和行號(hào)的操作

    go日志系統(tǒng)logrus顯示文件和行號(hào)的操作

    這篇文章主要介紹了go日志系統(tǒng)logrus顯示文件和行號(hào)的操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧...

    SmallQinYan12302021-02-02
  • Golanggolang如何使用struct的tag屬性的詳細(xì)介紹

    golang如何使用struct的tag屬性的詳細(xì)介紹

    這篇文章主要介紹了golang如何使用struct的tag屬性的詳細(xì)介紹,從例子說(shuō)起,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看...

    Go語(yǔ)言中文網(wǎng)11352020-05-21
  • GolangGolang通脈之?dāng)?shù)據(jù)類(lèi)型詳情

    Golang通脈之?dāng)?shù)據(jù)類(lèi)型詳情

    這篇文章主要介紹了Golang通脈之?dāng)?shù)據(jù)類(lèi)型,在編程語(yǔ)言中標(biāo)識(shí)符就是定義的具有某種意義的詞,比如變量名、常量名、函數(shù)名等等,Go語(yǔ)言中標(biāo)識(shí)符允許由...

    4272021-11-24
  • GolangGolang中Bit數(shù)組的實(shí)現(xiàn)方式

    Golang中Bit數(shù)組的實(shí)現(xiàn)方式

    這篇文章主要介紹了Golang中Bit數(shù)組的實(shí)現(xiàn)方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧...

    天易獨(dú)尊11682021-06-09
  • Golanggolang 通過(guò)ssh代理連接mysql的操作

    golang 通過(guò)ssh代理連接mysql的操作

    這篇文章主要介紹了golang 通過(guò)ssh代理連接mysql的操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧...

    a165861639710342021-03-08
  • Golanggo語(yǔ)言制作端口掃描器

    go語(yǔ)言制作端口掃描器

    本文給大家分享的是使用go語(yǔ)言編寫(xiě)的TCP端口掃描器,可以選擇IP范圍,掃描的端口,以及多線程,有需要的小伙伴可以參考下。 ...

    腳本之家3642020-04-25
  • Golanggolang json.Marshal 特殊html字符被轉(zhuǎn)義的解決方法

    golang json.Marshal 特殊html字符被轉(zhuǎn)義的解決方法

    今天小編就為大家分享一篇golang json.Marshal 特殊html字符被轉(zhuǎn)義的解決方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧 ...

    李浩的life12792020-05-27
Weibo Article 1 Weibo Article 2 Weibo Article 3 Weibo Article 4 Weibo Article 5 Weibo Article 6 Weibo Article 7 Weibo Article 8 Weibo Article 9 Weibo Article 10 Weibo Article 11 Weibo Article 12 Weibo Article 13 Weibo Article 14 Weibo Article 15 Weibo Article 16 Weibo Article 17 Weibo Article 18 Weibo Article 19 Weibo Article 20 Weibo Article 21 Weibo Article 22 Weibo Article 23 Weibo Article 24 Weibo Article 25 Weibo Article 26 Weibo Article 27 Weibo Article 28 Weibo Article 29 Weibo Article 30 Weibo Article 31 Weibo Article 32 Weibo Article 33 Weibo Article 34 Weibo Article 35 Weibo Article 36 Weibo Article 37 Weibo Article 38 Weibo Article 39 Weibo Article 40
主站蜘蛛池模板: 亚洲视频免费在线观看 | 久久er99热精品一区二区 | 国产精品香蕉 | 久久久久久久国产精品 | 欧美视频一区二区 | 亚洲男人天堂网 | 在线看av的网址 | 久久久久久免费看 | 高清中文字幕 | 日韩在线电影 | 国产精品久久久久久吹潮 | 久久综合久久久 | 日韩精品在线播放 | 爱色av网址| 精品乱码一区二区三四区 | av超碰| 黄色三级视频 | 精品久久久久久久人人人人传媒 | 欧美精品乱码久久久久久按摩 | 中文字幕久久精品 | 国产欧美一区二区视频 | 中文字幕日韩欧美一区二区三区 | 欧美久久久久久久 | 一级做a爰片久久毛片免费陪 | 国产精品久久久久久一区 | 中文字幕在线观看不卡视频 | 欧美日韩免费一区二区三区 | 欧美亚洲第一页 | 日韩福利| 欧美一区二区三区精品 | 中文字幕乱码亚洲精品一区 | 一级a性色生活片毛片 | 日韩福利一区二区 | 欧美日韩国产一区二区三区 | 日韩有码在线播放 | 中文字幕四区 | 国产日韩欧美在线观看 | 精品国产乱码一区二区三区 | 黄色毛片免费网站 | 电影91久久久 | 天天躁人人躁人人躁狂躁 |