记使用WaitGroup时的一个错误
生活随笔
收集整理的這篇文章主要介紹了
记使用WaitGroup时的一个错误
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
記使用WaitGroup時的一個錯誤
近期重構我之前寫的server代碼時,不當使用了WaitGroup,碰到了個錯誤,記錄下.
package mainimport ("fmt""sync""time" )func main() {var wg sync.WaitGroupwg.Add(1)f1 := func() {time.Sleep(time.Second * 2)fmt.Println("func()")wg.Done()}go f1()go f1()go f1()wg.Wait()fmt.Println("Done") }/* D:\test\>go run testwg2.go func() func() panic: sync: negative WaitGroup countergoroutine 22 [running]: runtime.panic(0x4a56e0, 0xc082000250)c:/go/src/pkg/runtime/panic.c:279 +0x11f sync.(*WaitGroup).Add(0xc0820045e0, 0xffffffffffffffff)c:/go/src/pkg/sync/waitgroup.go:64 +0x9a sync.(*WaitGroup).Done(0xc0820045e0)c:/go/src/pkg/sync/waitgroup.go:82 +0x37 main.func路001()D:/test/testwg2.go:17 +0xd2 created by main.mainD:/test/testwg2.go:22 +0x9a*/出現的錯誤: panic: sync: negative WaitGroup counter
關于這個錯誤, stackoverflow有個相關問題的鏈接.
還有一個錯誤:
package mainimport ("fmt""sync""time" )func main() {var wg sync.WaitGroupwg.Add(10)f1 := func() {time.Sleep(time.Second * 2)fmt.Println("func()")wg.Done()}go f1()go f1()go f1()wg.Wait()fmt.Println("Done") }/*D:\test\>go run testwg2.go func() func() func() fatal error: all goroutines are asleep - deadlock!goroutine 16 [semacquire]: sync.runtime_Semacquire(0xc0820001bc)c:/go/src/pkg/runtime/sema.goc:199 +0x37 sync.(*WaitGroup).Wait(0xc0820045e0)c:/go/src/pkg/sync/waitgroup.go:129 +0x152 main.main()D:/test/testwg2.go:24 +0xaagoroutine 19 [finalizer wait]: runtime.park(0x414db0, 0x55ec80, 0x55d689)c:/go/src/pkg/runtime/proc.c:1369 +0xac runtime.parkunlock(0x55ec80, 0x55d689)c:/go/src/pkg/runtime/proc.c:1385 +0x42 runfinq()c:/go/src/pkg/runtime/mgc0.c:2644 +0xdd runtime.goexit()c:/go/src/pkg/runtime/proc.c:1445 exit status 2*/事實上這些錯誤主要是當時wg的add與done由于一些原因分開處理了。
而
中間由于穿插了一大堆處理。一直done造成wg負數了,如例1,或者add
與done造成了deadlock。
以后實際處理中要注意下。盡量降低中間處理。把這樣的需相應的簡潔化處理.
只是近期重構server蠻爽的。經過大遍大遍的清理代碼,梳理流程后。
代碼看著順眼了非常多。
只是還是任重而道遠。
BLOG: blog.csdn.net/xcl168
轉載于:https://www.cnblogs.com/wzzkaifa/p/7199952.html
與50位技術專家面對面20年技術見證,附贈技術全景圖總結
以上是生活随笔為你收集整理的记使用WaitGroup时的一个错误的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 文件头文件尾总结
- 下一篇: Python开发基础----异常处理、s