大佬教程收集整理的这篇文章主要介绍了Golang 的 协程调度机制 与 GOMAXPROCS 性能调优,大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
<h4 id="前序">前序@H_675_1@
Golang 简称 Go,Go 的协程(goroutInE)
和我们常见的线程(Thread)
一样,拥有其调度器。@H_675_1@
go 关键词
时候会创建的一个对象处理器
,又称上下文队列
队列中
提取 G,并执行
GOMAXPROCS
(最大256),启动时固定的,一般不修改协程任务
交换全局队列
找goruTine
,它会加入到本地队列或者全局队列底层线程
,循环执行
能找到的 G 任务。这里的寻找的 G 从下面几方面找:
协程的切换时间片是10ms,也就是说 goroutIne 最多执行10ms就会被 M 切换到下一个 G。这个过程,又被称为 中断,挂起
@H_675_1@
原理:@H_675_1@
go程序启动时会首先创建一个特殊的内核线程 sysmon
,用来监控和管理,其内部是一个循环:@H_675_1@
如果检查到 schedtick
一直没有递增,说明这个 P 一直在执行同一个 G 任务,如果超过10ms,就在这个G任务的栈信息里面加一个 tag 标记@H_675_1@
然后这个 G 任务在执行的时候,如果遇到非内联函数调用,就会检查一次这个标记,然后中断自己,把自己加到队列末尾,执行下一个G@H_675_1@
如果没有遇到非内联函数
调用的话,那就会一直执行这个G任务,直到它自己结束;如果是个死循环,并且 GOMAXPROCS=1 的话。那么一直只会只有一个 P 与一个 M,且队列中的其他 G 不会被执行!@H_675_1@
例子,下面的这段代码,Hello world
不会被输出@H_675_1@
func main(){
runtime.GOMAXPROCS(1)
go func(){
fmt.Println("Hello world")
}()
go func(){
for {
}
}()
SELEct {}
}
看完上面的内容,相信你已经知道,GOMAXPROCS
就是 go 中 runtime 包的一个函数。它设置了 P 的最多的个数。这也就直接导致了 M 最多的个数是多少,而 M 的个数就决定了各个 G 队列能同时被多少个 M 线程来进行调取执行!@H_675_1@
故,我们一般将 GOMAXPROCS 的个数设置为 cpu 的核数,且需要注意的是:@H_675_1@
以上是大佬教程为你收集整理的Golang 的 协程调度机制 与 GOMAXPROCS 性能调优全部内容,希望文章能够帮你解决Golang 的 协程调度机制 与 GOMAXPROCS 性能调优所遇到的程序开发问题。
如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。
本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。