采纳答案成功!
向帮助你的同学说点啥吧!感谢那些助人为乐的人
func f3() { //runtime.GOMAXPROCS(1) wg := sync.WaitGroup{} for i := 0; i < 10; i++ { wg.Add(1) go func() { log.Println(i) wg.Done() }() } wg.Wait() }
想问下在这段代码里,for 循环里的每一步,不是得等到 goroutine 里 print,然后调用了 wg.Done () 才能进行下一步的循环吗?
wg.Done()是将计数器减一,并不会阻塞,真正会阻塞的是wg.Wait().所以这里for循环内部是不会发生阻塞的
你可以通过移动代码进行验证你的猜想,在go func闭包函数的最后一行休眠1秒,然后在在闭包外打印日志,就可以验证了。goroutine是异步执行的,所以这里for循环遇到go func就会立马进行下一次for循环,不论go func里面的任务是否执行完,都会立马进行下一次for循环
知道了,是我对一些概念的理解还不到位。
在 for 循环里,wg.Add(1) 只是做了计数的增加,不会有什么拦截、等待之类的作用。因此 for 循环里可能将计数器加到 10,才来执行那些 goroutine。
登录后可查看更多问答,登录/注册
GO工程师面试与技能提升专题课程
141 6
54 5
231 5
125 4
263 3