package main
import("fmt""runtime")funcmain(){
runtime.GOMAXPROCS(1)for i :=0; i <1000; i++{OrderPrint()
fmt.Println("---")}}funcOrderPrint(){
ch :=make(chanint,10)for i :=1; i <=3; i++{gofunc(i int){
ch <- i
}(i)}for i :=0; i <3; i++{
fmt.Println(<-ch)// 3 1 2}}
这个和GMP调度模型有关,假如:go_1 先被入队、go_2 后被入队、go_3最后入队,让后调度器还在go_3这里进行调度,调度完成后按顺序执行
为什么会一定先输出3?协程执行的顺序都是不固定的,123 321 312 213 这种情况都会出现
这道题的前提条件是:
runtime.GOMAXPROCS(1)
默认情况下会因为处于自旋状态的MP模型会进行偷取其他队列的G,进而导致你的打印结果是个乱序的
顺序是随机的,可以做一下基准测试看看是不是
非常奇怪, 我本地(go.1.22)一直是 3,1,2
换playground 第一次 3,2,1 后面重复run 一直是 3,1,2 重新进playground 第一次 3,2,1
又试了试,是3这个数字太小了, 没法实现面试官要的效果,我本地一直 3,1,2
如果是30 ,就跟一楼说的一致, maxprocs=1时, 30,1,…,29
maxprocs>1时, 1,2,…,30