GMP问题第1段第2段
第一段packagemainimport ' fmt ' import ' runtime ' func main ((runtime.gomaxprocs )1) for i :=0; i10; i {i :=igo func () fmt.println (),I ) } ) varch=make(chanint )-ch () ) ) ) ) )。
输出结果无论执行多少回,A: 9 一定是第一个输出的。后面就让我们来解释一下这是为什么吧。,
a :9 a :0 a :1 a :2 a :3 a :3 a :4 a :5 a :6 a :7 a :8分析: http://www.Sina.com/3: runtime.gomaxpppp
所有goroutine都进入三个队列(runnext、local、gobal )。
第一句代码: for打开10个循环的代码。
http://www.Sina.com/: I :=I其中,对于for循环,I是指针。 如果在循环中的代码中使用for语句的I,则所有goroutine获取的I都是9,即I的最后一个循环的值。
打开3358 www.Sina.com/: go func { } go routine
3358 www.Sina.com/: fmt.println () goroutine执行内容为打印A: i
3358 www.Sina.com/: varch=make (chanint )创建无缓冲区的chan
第二句代码: - ch无缓冲区读取,如果chan中没有信息,则将其阻止。 此处用于阻止main ()进程
第三句代码
如果首先将p设置为1,并且GMP调度模型中只有一个p,则所有goroutine都将排队(三个队列)。 当golang打开goroutine时,所有goroutine都放在runnext队列中;如果runnext具有goroutine,则现有的goroutine放在本地队列中;新的goroutine放在runnext中也就是说,在循环中打开10个goroutine时,最后一个变为runnext,优先执行。 这里,最后一个gogoroutine的I是9,因此,当第一次打印9并执行runnext时,从本地队列的开头开始,第二个goroutine段的分组路径时间导入fmt导入routine i {i :=igo func () fmt.println ()、I ) } ) } time.sleep (time.hour ) } 1.13输出结果
a :0 a :1 a :2 a :3 a :3 a :4 a :5 a :6 a :7 a 33608 a :91.14输出结果
a :9 a :0 a :1 a :2 a :3 a :3 a :4 a :5 a :6 a :7 a :8分析: http://www.Sina.com/3: runtime.gomaxpppp
所有goroutine都进入三个队列(runnext、local、gobal )。
第四句代码: for打开10个循环的代码。
http://www.Sina.com/: I :=I其中,对于for循环,I是指针。 如果在循环中的代码中使用for语句的I,则所有goroutine获取的I都是9,即I的最后一个循环的值。
打开3358 www.Sina.com/: go func { } go routine
3358 www.Sina.com/: fmt.println () goroutine执行内容为打印A: i
3358 www.Sina.com/: time.sleep (time.hour )将程序暂停一个小时。 请注意,1.13和1.14版本的time实现略有不同。 1.13创建goroutine,但不创建1.14
第五句代码
如果首先将p设置为1,并且GMP调度模型中只有一个p,则所有goroutine都将排队(三个队列)。 当golang打开goroutine时,所有goroutine都放在runnext队列中;如果runnext具有goroutine,则现有的goroutine放在本地队列中;新的goroutine放在runnext中也就是说,在循环中打开10个goroutine时,最后一个变为runnext,优先执行。 此时,如果运行到time.sleep(time.hour ),则在1.13之前将为time的实现创建另一个goroutine,该goroutine将优先运行。 然后,从local队列开始。