面试者与面试官

以下main函数的输出结果是什么?

func main() {
	runtime.GOMAXPROCS(1)
	
	var wg sync.WaitGroup
	wg.Add(3)
	
	go func(n int) {
		println(n)
		wg.Done()
	}(1)
	
	go func(n int) {
		println(n)
		wg.Done()
	}(2)
	
	go func(n int) {
		println(n)
		wg.Done()
	}(3)
	
	wg.Wait()
}

答案:312

解析:任务队列的优先级有三种 - P.runnext、P.runq以及全局的Schedt.runq,schedule调度时除了每隔一段就尝试从全局队列中去获取g外,还会尝试从本地队列中获取g,P.runnext的优先级更高,然后是队列的头部取。