runtime.Gosched()
作用是让出CPU时间片,重新等待安排任务。执行runtime.Gosched()后,其他协程优先执行,当前所在协程最后执行。
package mainimport ("fmt""runtime"
)func main() {go func(s string) {for i := 0; i < 10; i++ {fmt.Println(s)}}("world")// 主协程for i := 0; i < 2; i++ {// 切一下,再次分配任务runtime.Gosched()fmt.Println("hello")}
}
runtime.Goexit()
终止协程,不再调用,注意不能在main方法中终止,会触发panic.
package mainimport ("fmt""runtime""time"
)func printHello() {defer fmt.Println("end func printHello")for i := 1; i < 10; i++ {fmt.Println("start print")if i%4 == 0 {runtime.Goexit()}fmt.Printf("start print:%d\n", i)}
}func main() {go printHello()time.Sleep(6 * time.Second)
}
由以上代码可以看出,实际上触发runtime.Goexit()后,协程立即停止运行了。
runtime.GOMAXPROCS
设置最大运行核心数,Go运行时的调度器使用GOMAXPROCS参数来确定需要使用多少个OS线程来同时执行Go代码
其他
runtime包实际上有非常多方法,例如加上panic的trace信息:
package mainimport ("fmt""runtime""time"
)func a() {err := runtime.StartTrace()if err != nil {return}fmt.Println("start trace__")defer fmt.Printf("done")for i := 1; i < 10; i++ {if i%4 == 0 {panic("err non")}}runtime.StopTrace()
}func main() {go a()time.Sleep(time.Second)
}
runtime还有很多其他的用法,之后可以挨个试试。