大佬教程收集整理的这篇文章主要介绍了Golang协程调度,大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
有时候可能会出现这种情况,一个无耻的goroutine阻止其他goroutine运行。当你有一个不让调度器运行的 for循环时,这就会发生。
package main import "fmt" func main() { done := false go func(){ done = true }() for !done { } fmt.Println("done!") }for循环并不需要是空的。只要它包含了不会触发调度执行的代码,就会发生这种问题。
具体的实现都在src/runtime/proc.c里,而要完成主动抢占,Go是采用在stack上做标记(g->stackguard0=StackPreempt),每次函数调用的时候会检查是否需要抢占,于是要想真的抢占goroutine cpu,只能等它调用任意一个非内联的函数。
package main import "fmt" func main() { done := false go func(){ done = true }() for !done { fmt.Println("not done!") //not inlined } fmt.Println("done!") }要想知道你在 for循环中调用的函数是否是内联的,你可以在“go build”或“go run”时传入“-m” gc标志(如, go build -gcflags -m)。
package main import ( "fmt" "runtime" ) func main() { done := false go func(){ done = true }() for !done { runtime.Gosched() } fmt.Println("done!") }
以上是大佬教程为你收集整理的Golang协程调度全部内容,希望文章能够帮你解决Golang协程调度所遇到的程序开发问题。
如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。
本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。