【golang】goroutine调度的坑
今天说说我遇到的一个小坑, 关于goroutine 调度的问题。
关于goroutine的调度,网上资料已经一大堆了,这里就不再赘述了。还是简单的说一下我理解的goroutine的调度。goroutine是语言层面的,它和内核线程是M:N的关系,并且用了分段栈,是相当轻量了。如果设置runtime.GOMAXPROCS为1,那么会有一个上下文G,在G上会有一个对应的内核线程M,内核线程M上可以对应很多个goroutine记作G,每个上下文都会有一个队列称作runqueue,在用go关键字开启一个goroutine的时候,该goroutine就会被装入runqueue中,然后被M用来执行,如果刚好有两个goroutine在队列里,先执行的goroutine因为执行一些耗时操作(系统调用,读写 channel,gosched 主动放弃,网络IO)会被挂起(扔到全局runqueue),然后调度后面的goroutine。好,重点在这里,看一下下面的一段代码
func main(){
runtime.GOMAXPROCS(1)
waitGroup.Add(1)
go func(){