golang中的runtime包
1. runtime.Gosched 让出CPU时间片,重新等待安排任务
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | package main import ( "fmt" "runtime" ) func main() { go func (s string) { for i :=0; i < 2; i++ { fmt.Println(s) runtime.Gosched() // 让出CPU时间片,重新等带安排任务 } }( "world" ) for i := 0; i < 2; i++ { fmt.Println( "hello" ) runtime.Gosched() // 让出CPU时间片,重新等待安排任务 } } |
2. runtime.Goexit 退出当前协程
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 | package main import ( "fmt" "runtime" "sync" ) var wg sync.WaitGroup func main() { wg.Add(1) go func () { defer wg.Done() defer fmt.Println( "A.defer" ) func () { defer fmt.Println( "B.defer" ) // 结束协程 runtime.Goexit() defer fmt.Println( "C.defer" ) fmt.Println( "B" ) }() fmt.Println( "A" ) }() wg.Wait() // 主goroutine等待子goroutine结束,主在结束 } |
3. runtime.GOMAXPROCS
Go运行时调度器使用runtime.GOMAXPROCS参数来确定需要使用多少个os线程来同时执行go代码,
默认值是机器上的CPU核心数量,例如一个8核心的机器上,调度器会把go代码同时调度到8个os线程上,
(GOMAXPROCS是m:n调度中的n)
go语言中可以通过runtime.GOMAXPROCS()函数来设置当前程序并发时占用的CPU逻辑核心数
go1.5版本之前默认使用的是单核心执行,1.5之后默认使用全部的cpu逻辑核心数
我们可以通过将任务分配到不同的CPU逻辑核心上,从而实现并行的效果
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 | package main import ( "fmt" "runtime" "sync" "time" ) var wg sync.WaitGroup func a() { defer wg.Done() for i := 0; i < 100000000; i++ { //fmt.Println("A", i) } } func b() { defer wg.Done() for i := 0; i < 100000000; i++ { //fmt.Println("B", i) } } func main() { startTime := time.Now() //runtime.GOMAXPROCS(1) // 设置go运行时(runtime)的os线程数 // runtime.GOMAXPROCS设置为1os线程数时执行时间要比4os线程数用时更长 runtime.GOMAXPROCS(4) // 设置go运行时(runtime)的os线程数 wg.Add(1) go a() wg.Add(1) go b() wg.Add(1) go a() wg.Add(1) go b() wg.Wait() fmt.Println(time.Now().Sub(startTime)) } |
运行结论:runtime.GOMAXPROCS设置为1os线程数时执行时间要比4os线程数用时更长
1os线程数执行时耗时:320ms左右,4os线程数执行耗时:160ms左右,不同系统运行时不太一样
因为: 1os线程数goroutine只能是并发执行,而4os线程数goroutine可以并行执行,所以快。
总结:
runtime.Gosched() 让出cpu时间片,等待重新分配任务
runtiem.Goexit() 退出协程
runtime.GOMAXPROCS(i int) 执行go程序时对应的os线程数,即m:n中的n值
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 没有源码,如何修改代码逻辑?
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· .NET10 - 预览版1新功能体验(一)