这是因为 main协程和 子协程共享变量造成的问题,主要执行流程如下:
package main
import "time"
func main() {
var testNum = 0
...这就涉及到了go的协程调度问题了,具体是怎么调度的呢?...go的协程调度
go的协程调度为 [典藏版] Golang 调度器 GMP 原理与调度全分析
简单说明:
G:协程
M:运行的线程
P:执行线程的处理器,可以理解为cpu中的线程/进程
- 在运行时,...,则变成了100%输出 testNum=1:
刚刚我们看到了GMP的第一点,有多少个P,就应该有多少个M/G同时运行,那么问题来了,为什么上面的2个协程没有并行呢?...如果M没有可以执行的G后,将会偷其他M的G
在示例代码,由于是先执行的go func,sleep(协程2),所以M在执行main开始之后,立即开始执行协程2,同时由于协程2 sleep阻塞,所以切回main