欢迎访问 生活随笔!

生活随笔

当前位置: 首页 > 编程资源 > 编程问答 >内容正文

编程问答

golang中的runtime

发布时间:2025/6/15 编程问答 26 豆豆
生活随笔 收集整理的这篇文章主要介绍了 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() 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 《新程序员》:云原生和全面数字化实践50位技术专家共同创作,文字、视频、音频交互阅读

总结

以上是生活随笔为你收集整理的golang中的runtime的全部内容,希望文章能够帮你解决所遇到的问题。

如果觉得生活随笔网站内容还不错,欢迎将生活随笔推荐给好友。