🔥码云GVP开源项目 12k star Uniapp+ElementUI 功能强大 支持多语言、二开方便! 广告
[TOC] # Gosched runtime.Gosched()让出cpu的时间片,让出当前协程的执行权限,调度器安排其他等待的任务运行,并在下次某个时间从该位置恢复执行 和协程 yield 作用类似 ~~~ func main() { go func() { for i := 0; i < 5; i++ { //不一定打印5次 fmt.Println("go") } }() //别忘记() for i := 0; i < 2; i++ { //让出我的时间片 runtime.Gosched() fmt.Println("hello") } } ~~~ # Goexit 调用runtime.Goexit()将立即终止当前协程运行,调度器确保所有已注册defer延迟调用执行 有时候我们会遇到这个问题 **调度器确保所有已注册defer延迟调用被执行,要在Goexit之前注册** ~~~ func test() { defer fmt.Println("test-------") return //终止使用此函数 fmt.Println("1111111111") } func main() { go func() { fmt.Println("aaaa") //调用了别的函数 test() //没打印 fmt.Println("bbb") }() //别忘记() for { } } ~~~ 输出 ~~~ aaaa test------- bbb ~~~ ~~~ func test() { defer fmt.Println("test-------") //终止这个协程 runtime.Goexit() //return fmt.Println("1111111111") } func main() { go func() { fmt.Println("aaaa") //调用了别的函数 test() //没打印 fmt.Println("bbb") }() //别忘记() for { } } ~~~ 输出 ~~~ aaaa test------- ~~~ # GOMAXPROCS 调用runtime.GOMAXPROCS()用来设置可以并行计算的cpu核数的最大值,并返回之前的值 ~~~ func main() { //指定核数 n := runtime.GOMAXPROCS(2) fmt.Println(n) } ~~~ # 多任务资源竞争 ~~~ //定义一个打印机 //打印机属于公共资源 func Printer(str string) { for _, data := range str{ fmt.Printf("%c", data) time.Sleep(time.Second) } fmt.Printf("\n") } func Person1() { Printer("hello") } func Person2() { Printer("world") } func main() { //新建2个协程,代表2个人,2个人同时使用打印机 go Person1() go Person2() //特意不让主协程结束,死循环 for { } } ~~~ 打印会乱掉 我们如何让他同步呢 # 其他的小功能 返回go的根目录,存在GOROOT环境变量返回该环境变量,不存在返回go的根目录 ~~~ func GOROOT() string ~~~ 版本 ~~~ func Version() string ~~~ cpu个数 ~~~ func NumCPU() int ~~~ GC ~~~ func GC() ~~~ # 查看时间 ~~~ go build main.go time -p ./main ~~~ 输出结果: ~~~ 0 9223372030412324865 1 9223372030412324865 real 1.92 // 程序开始到结束时间差 ( CPU 时间) user 3.80 // 用户态所使用 CPU 时间片 (多核累加) sys 0.01 // 内核态所使用 CPU 时间片 ~~~ 命令行输入: ~~~ GOMAXPROCS=8 time -p ./main ~~~ 输出结果: ~~~ 1 9223372030412324865 0 9223372030412324865 real 1.89 user 3.76 // 虽然总时间差不多,但由 2 个核并行,real 时间自然少了许多。 sys 0.00 ~~~