GMP中的M是machine,也就内核线程。一直有个疑惑M的数量会是多少,毕竟协程就是减少线程的切换,那么线程的数量应该会很少。
首先我的电脑是这样的,开启4个协程能够把cpu打满
package main
import "time"
func main() {
n_goroutine := 10000
for i := 0; i < n_gorotuine; i++ {
go func() {
for {
}
}()
}
time.Sleep(100 * time.Second)
}
一开始
大概10s后
无论开启2个,10个,100… 都是上面的结果
从trace工具来看线程从1个到4个,至于为什么上面显示开始8个,后面5个就不太清楚了。这可能是其它额外的工作。
疑惑:这个程序只有几个线程,相对于整个机器的几千个线程很少,但是依然能够占用几乎所有的cpu。
猜测:可能是因为,虽然系统中有这么多线程,但是很多都是定时任务,比如每秒检查一次,大部分都是挂起的线程,go的线程就能分配到很多时间了。进一步了解就需要了解操作系统的调度,线程优先级等等了。