# 4.4、Golang 并发编程-runtime包 runtime定义了协程管理的包 ## Gosched 让出执行权限 示例 ```go package main import ( "fmt" ) func show() { for i := 0; i < 2; i++ { fmt.Printf("show i: %v\n", i) } } func main() { go show() for i := 0; i < 2; i++ { fmt.Printf("main i: %v\n", i) } fmt.Println("end") } ``` 输出 ``` main i: 0 main i: 1 end ``` 示例 2 ```go package main import ( "fmt" "runtime" ) func show() { for i := 0; i < 2; i++ { fmt.Printf("show i: %v\n", i) } } func main() { go show() for i := 0; i < 2; i++ { // 让出执行权限,给其他子协程执行 runtime.Gosched() fmt.Printf("main i: %v\n", i) } fmt.Println("end") } ``` 输出 ``` show i: 0 main i: 0 main i: 1 end ``` ## Goexit 退出当前协程 示例 ```go package main import ( "fmt" "runtime" "time" ) func show() { for i := 0; i < 10; i++ { fmt.Printf("show i: %v\n", i) if i >= 5 { runtime.Goexit() } } } func main() { go show() time.Sleep(time.Second) fmt.Println("end") } ``` 输出 ``` show i: 0 show i: 1 show i: 2 show i: 3 show i: 4 show i: 5 end ``` ## GOMAXPROCS 设置CPU数量 ```go package main import ( "fmt" "runtime" "time" ) func show(name string) { for i := 0; i < 10; i++ { fmt.Printf("%v i: %v\n", name, i) } } func main() { // 查看CPU核数 fmt.Printf("runtime.NumCPU(): %v\n", runtime.NumCPU()) // runtime.NumCPU(): 8 // 设置CPU数量 runtime.GOMAXPROCS(2) go show("A") go show("B") time.Sleep(time.Second) fmt.Println("end") } ```