💎一站式轻松地调用各大LLM模型接口,支持GPT4、智谱、星火、月之暗面及文生图 广告
## 一、概念 * runtime.Gosched():出让CPU时间片,等待重新安排任务 * runtime.Goexit():立刻结束当前协程的执行 * runtime.GOMAXPROCS():设置并行计算的CPU最大核数 ## 二、runtime.Gosched()实例 #### 没有runtime.Gosched() ~~~ package main import ( "fmt" ) func main() { // 子协程 go func(s string) { for i:=0;i<3;i++ { fmt.Println(s) } }("hello") // 主协程 for i:=1;i<3;i++ { fmt.Println("aaa") } } ~~~ 执行结果: hello hello hello aaa aaa #### 有runtime.Gosched() 注:通过上面多次执行我们发现,很多情况下都先打印出主协程中的内容,如果我们想更多的机会先打印子协程中的内容那么我们可以在主协程中加runtime.Gosched() ~~~ package main import ( "fmt" "runtime" ) func main() { // 子协程 go func(s string) { for i:=0;i<3;i++ { fmt.Println(s) } }("hello") // 主协程 for i:=1;i<3;i++ { runtime.Gosched() fmt.Println("aaa") } } ~~~ 打印结果: hello hello hello aaa aaa ## 三、runtime.Goexit() #### 没有runtime.Goexit() ~~~ package main import ( "fmt" ) func main() { // 子协程 go func() { defer fmt.Println("A.defer") func(){ defer fmt.Println("B.defer") fmt.Println("B") }() defer fmt.Println("A") }() // 主协程 for i:=1;i<3;i++ { fmt.Println("aaa") } } ~~~ 打印结果: B B.defer A A.defer aaa aaa #### 有runtime.Goexit() ~~~ package main import ( "fmt" "runtime" ) func main() { // 子协程 go func() { defer fmt.Println("A.defer") func(){ defer fmt.Println("B.defer") runtime.Goexit() fmt.Println("B") }() defer fmt.Println("A") }() // 主协程 for i:=1;i<3;i++ { fmt.Println("aaa") } } ~~~ 打印结果: aaa aaa 注: runtime.Goexit()不影响defer的执行 ## 三、runtime.GOMAXPROCS() ~~~ package main import ( "fmt" "runtime" ) func main() { // 使用4个核去执行程序 n := runtime.GOMAXPROCS(4) fmt.Printf("n=%d\n",n) // 假设我们让一个核去执行一个程序 for{ go fmt.Print(0) fmt.Print(1) } } ~~~