有两件奇怪的事情。
我在 slice 中制作了 1000 个数字,但它只打印了 246,为什么是 246?为什么不是 1000?
如果我删除“log.Println("hey")"这一行,为什么它只打印0?
我知道它可能有同步问题,但我以前没有写过任何并发程序,所以有文章可以推荐吗?
import (
"log"
"runtime"
)
func main() {
count := 1000
slice := make([] int,count)
for i := 0; i <= count-1; i++ {
slice[i] =i
}
for _,v := range slice{
go echo(v)
}
log.Println("hey")//if delete this line,it just print 0
runtime.Gosched()
}
func echo(v int) {
log.Println(v)
}
最佳答案
无法保证任何 go 例程都会在您的主例程完成之前运行。当主例程完成时,您的程序将退出,而无需等待您创建的所有 go 例程完成(甚至开始)。
解决此问题的最简单方法是分配一个同步 channel ,将其传递给每个 echo 实例,并在您的日志语句后向其写入一个标记。然后主线程应该在返回之前从该 channel 读取 count
个 token 。
关于go - 处理 goroutine 时的奇怪事情,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20138950/