)
}
println("testNum=",testNum)
//10000纳秒之前,为0
//在执行完这条后,testNum突然被更新为了1,所以不会进行下一次循环... }
println("loop end.")
}
那么,这里面又涉及到了一个新的问题:
为什么是刚好在执行完一次循环之后,才刚好轮到testNum=1,而不是在执行前之前轮转到呢?...] Golang 调度器 GMP 原理与调度全分析
简单说明:
G:协程
M:运行的线程
P:执行线程的处理器,可以理解为cpu中的线程/进程
- 在运行时,G必须绑定在M上,M必须在P上才可以运行程序...,而cpu调度器执行的是P,也就是有多少核心,或者有多少个P,就可以同时运行多少个M/G
- 多个G绑定在M上,在发生syscall或者io阻塞时,会自动挂起,M将切换其他G执行,当G运行时间超过10ms...(1.14后加入),会自动切换成其他协程
理解这2句话就够了,我们回到代码:
因为加了输出,导致了协程一定会切换,所以100%可以复现上面的问题,如果这句输出放到上面去运行,则变成了100%输出 testNum