協(xié)程go多了疮茄,總覺的天下我有滥朱,沒事就喜歡go一個協(xié)程,信手拈來力试,在項目中寫個如下類似代碼:
wh := sync.WaitGroup{}
out := make(chan string)
go func() {
wh.Wait()
close(out)
}()
go func() {
for i := 0; i < 2; i++ {
wh.Add(1)
go tt(out)
wh.Done()
}
}()
想著開個協(xié)程去wait所有協(xié)程組徙邻,測試一下通了,沒問題畸裳,好牛逼缰犁,協(xié)程呀!怖糊!
可多測試即便就會出現(xiàn):
send close channel
或者協(xié)程定死在某一個帅容,還自已為是的認為自己寫的子方法估計不小心關(guān)閉了channel,找了半天只找到在wg.wait()后進行了關(guān)閉伍伤。就這樣扣了好久并徘,還沒想到自己畫蛇添足的錯誤,經(jīng)大佬一指點扰魂,原來開一個協(xié)程麦乞,還沒等后一個協(xié)程進行wg.add(1)操作,wg.wait()就已經(jīng)過了劝评,關(guān)閉了channel姐直。
只好老老實實寫:
wh := sync.WaitGroup{}
out := make(chan string)
go func() {
for i := 0; i < 2; i++ {
wh.Add(1)
go tt(out)
wh.Done()
}
wh.Wait()
close(out)
}()
其實就是一個小小的同步問題,旁觀者清呀=蟆I贰!