本文主要是介绍all goroutines are asleep - deadlock错误,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
先看例子:
package mainimport ("fmt""math/rand""sync""time"
)var wg sync.WaitGroupfunc hello(i int) {defer wg.Done()fmt.Println("hello go", i)
}
func main() {for i := 0; i < 10; i++ {wg.Add(i)go hello(i)}wg.Wait()
}
这个代码看着没问题吧。几乎所有你在国内的网页上能查到的都会是这样的例子,并且告诉你没问题,但实际上会出现如下的错误:
这个错误的意思就是所有的子携程都已经结束了。 但是主线程还在等候。 很多大神都会告诉你没大事。但是怎解决?
按照go的QA上的解决方式例子里, 需要将函数在匿名函数中调用。
修改如下:
package mainimport ("fmt""math/rand""sync""time"
)var wg sync.WaitGroupfunc hello(i int) {fmt.Println("hello go", i)
}
func main() {for i := 0; i < 10; i++ {wg.Add(1)go func(i int) {defer wg.Done()hello(i)}(i)}wg.Wait()
}
代码运行正常。
这篇关于all goroutines are asleep - deadlock错误的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!