请稍等 ...
×

采纳答案成功!

向帮助你的同学说点啥吧!感谢那些助人为乐的人

关于 goroutine 延迟绑定的一个问题

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 () 才能进行下一步的循环吗?

正在回答

2回答

wg.Done()是将计数器减一,并不会阻塞,真正会阻塞的是wg.Wait().所以这里for循环内部是不会发生阻塞的

0 回复 有任何疑惑可以回复我~
  • 你可以通过移动代码进行验证你的猜想,在go func闭包函数的最后一行休眠1秒,然后在在闭包外打印日志,就可以验证了。goroutine是异步执行的,所以这里for循环遇到go func就会立马进行下一次for循环,不论go func里面的任务是否执行完,都会立马进行下一次for循环
    回复 有任何疑惑可以回复我~ 2023-12-02 23:06:59
提问者 JD 2023-12-02 17:41:10

知道了,是我对一些概念的理解还不到位。

在 for 循环里,wg.Add(1) 只是做了计数的增加,不会有什么拦截、等待之类的作用。因此 for 循环里可能将计数器加到 10,才来执行那些 goroutine。

0 回复 有任何疑惑可以回复我~
问题已解决,确定采纳
还有疑问,暂不采纳
意见反馈 帮助中心 APP下载
官方微信