golang中的runtime
生活随笔
收集整理的这篇文章主要介绍了
golang中的runtime
小编觉得挺不错的,现在分享给大家,帮大家做个参考.
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()//returnfmt.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() stringcpu个数
func NumCPU() intGC
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 《新程序员》:云原生和全面数字化实践50位技术专家共同创作,文字、视频、音频交互阅读总结
以上是生活随笔为你收集整理的golang中的runtime的全部内容,希望文章能够帮你解决所遇到的问题。
- 上一篇: golang协程退出
- 下一篇: golang中的select详解