runtime 里的三个函数 Gosched、Goexit、GOMAXPROCS
Gosched:让出 cpu 时间切片。用于让出当前 grouting 的执行权限,调度器安排其他等待的 goroutine 执行任务,并在某个位置恢复执行
Goexit:终止当前的 goroutine 执行,并不会影响其他的 goroutine 执行。并在终止当前的 goroutine 之前,执行还未执行的 defery 语句. 如果 Goexit 在 main 函数中执行会报 panic
GOMAXPROCS:用来设置可以并行计算的 CPU 核数最大值,并返回之前的值。1~256 最好在主函数之前设置,否则会终止当前的任务执行
Go 默认是一个 cpu 核的,可以通过 GOMAXPROCS 来设置
Gosched:
不加 Gosched, 子协程并不会打印出来
func main() {
// 子协程
go func() {
for i := 0; i < 2; i++ {fmt.Println(" 会打印吗 ")
}
}()
// 主协程
for i := 0; i < 2; i++ {fmt.Println(" 我会打印!!!!")
}
}
结果:
我会打印!!!!我会打印!!!!
加 Gosched, 子协程就可以打印出来
func main() {go func() {
for i := 0; i < 2; i++ {fmt.Println(" 会打印吗 ")
}
}()
// 主协程
for i := 0; i < 2; i++ {runtime.Gosched()
fmt.Println(" 我会打印!!!!")
}
}
结果:
会打印吗
会打印吗
我会打印!!!!我会打印!!!!
Goexit:
func test() {defer fmt.Println(" 还未执行的 defer 语句 ")
runtime.Goexit()
fmt.Println(" 这条信息还能打印吗????")
}
func main() {
// 子协程
go func() {fmt.Println(" 哈哈哈哈哈哈哈 ")
test()
fmt.Println(" 来打我呀!!!!!")
}()
// 死循环,为了不让主协程退出
for {}}
结果:
哈哈哈哈哈哈哈
还未执行的 defer 语句
GOMAXPROCS:
func main() {runtime.GOMAXPROCS(2)
for {go fmt.Println("go")
fmt.Print(0)
}
}
正文完