为啥:呜呜呜呜...是随机打印的, 而不是完整的十条?
package main
import (
"fmt"
"sync"
)
func main() {
var once sync.Once
onceBody := func() {
fmt.Println(":Only once")
}
done := make(chan bool)
for i := 0; i < 10; i++ {
go func(i int) {
once.Do(onceBody)
done <- true
fmt.Println("呜呜呜呜...")
}(i)
}
for i := 0; i < 10; i++ {
<-done
}
}
结果:
:Only once
呜呜呜呜... // 这里可能是1-10条
而在"done <- true"前再加一个打印, 就可以输出10条?
你的代码我把
sync.Once
拿掉也是你这样输出,所以问题不是sync.Once
导致的说明一下
无缓冲通道阻塞
的场景:再说说你的代码:
阻塞调度问题
,当你的fmt.Println("呜呜呜呜...")
写在通道后面时,如果通道先阻塞,那代码下不去(也就是不走呜呜呜
那行),没问题吧?呜呜呜
输出不可预测的原因),如果你想看到10个呜呜呜,那你可以在代码的最后加time.Sleep
另外协程的并发控制可以看看我的文章,写的很实用
golang限制协程数量