让 Go 更强大的原因之一莫过于它的 GODEBUG 工具,GODEBUG 的设置可以让 Go 程序在运行时输出调试信息,可以根据你的要求很直观的看到你想要的调度器或垃圾回收等详细信息,并且还不需要加装其它的插件,非常方便,今天我们将先讲解 GODEBUG 的调度器相关内容,希望对你有所帮助。 不过在开始前,没接触过的小伙伴得先补补如下前置知识,便于更好的了解调试器输出的信息内容。 前置知识 Go scheduler 的主要功能是针对在处理器上运行的 OS 线程分发可运行的 Goroutine,而我们一提到调度器,就离不开三个经常被提到的缩写,分别是: G:Goroutine,实际上我们每次调用 go func 就是生成了一个 G。 P:处理器,一般为处理器的核数,可以通过 GOMAXPROCS 进行修改。 M:OS 线程 这三者交互实际来源于 Go 的 M: N 调度模型,也就是 M 必须与 P 进行绑定,然后不断地在 M 上循环寻找可运行的 G 来执行相应的任务,如果想具体了解可以详细阅读 《Go Runtime Scheduler》,我们抽其中的工作流程图进行简单分析,如下: