企业🤖AI智能体构建引擎,智能编排和调试,一键部署,支持私有化部署方案 广告
### Gosched() 使当前Go协程放弃处理器,让其他协程运行。不会挂起当前协程,未来恢复执行。 Go语言的协程是抢占式调度,当遇到长时间执行或者系统调用时,会主动把当前goroutine的CPU(P)转让出去,让其他的goroutine能够被调用并执行,一般出现以下几种情况,goroutine就会发生调度: * [ ] ayscall * [ ] C函数调用 * [ ] 主动调用runtime.Goschen * [ ] 某个goroutine的调用超过100ms,并且调用了非内联的函数 > **runtime.Gosched()** > 由于main函数抢占了CPU的控制权,导致第一个for循环没有运行完。如果想要第一个for循环执行,在第二个for循环中使用runtime.Gosched()来阻止获得控制权 ``` package main import ( "fmt" // "runtime" ) func main() { go func() { for i := 0; i < 3; i++ { fmt.Println("go") } }() for i := 0; i < 2; i++ { // runtime.Gosched() fmt.Println("main") } } 结果: main main go ``` ### Goexit() 终止调用的协程,其他的不受影响 > **runtime.Goexit()** ``` package main import ( "fmt" "runtime" "time" ) func main() { go func() { defer fmt.Println("defer关键词 会让表达式最后执行") fmt.Println("Hello World") }() go func() { defer fmt.Println("defer关键词 会让表达式最后执行") fmt.Println("你好,世界!") runtime.Goexit() // 效果和return一样 fmt.Println("这里不会执行") }() time.Sleep(time.Second * 5) } 结果: 你好,世界! Hello World defer关键词 会让表达式最后执行 defer关键词 会让表达式最后执行 ``` ### GOMAXPROCS() 设置程序运行中使用的CPU数,可设置同时执行最大CPU数。 > runtime.GOMAXPROCS() ``` package main import ( "fmt" "runtime" "time" ) func main() { n := runtime.GOMAXPROCS(1) fmt.Println("先前最大核心数为", n) // 运行时间戳 毫秒 last := time.Now() // 耗时任务 for i := 0; i < 10000000; i++ { a := 1 a += 1 } now := time.Now() // 计算程序运行的时间 fmt.Println(now.Sub(last)) } 结果: 先前最大核心数为 12 2.1563ms ```