前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >GOMAXPROCS的使用

GOMAXPROCS的使用

作者头像
天地一小儒
发布2022-12-28 14:06:02
8260
发布2022-12-28 14:06:02
举报
文章被收录于专栏:信且诚心之动
  1. GOMAXPROCS的作用是控制你的程序最大能跑满几个逻辑CPU,也就是通常我们说的几核几核
  2. 默认情况下GOMAXPROCS的值就是NumCPU()的值
  3. 程序中设置了GOMAXPROCS的值后,此后的所有程序都会被限制在这个值内,所以,要想单独控制某段程序的负载,请设置完后,再设置回来。如下测试案例,SleepWait控制最多使用一半的cpu,我的虚拟机是6核,所以cpu轻松跑到300%,10秒过后,如果我不把Test_GOMAXPROCS注释的那段放开,主程序也会最大负载300%
  4. 当程序已经有协程阻塞时,runtime.GOMAXPROCS(runtime.NumCPU())会被阻塞,直到所有协程都无阻塞。
代码语言:javascript
复制
func Test_GOMAXPROCS(t *testing.T) {
    SleepWait(10 * time.Second)
    fmt.Println("???")
    // result := runtime.GOMAXPROCS(runtime.NumCPU())
    // fmt.Println("result", result)
    for i := 0; i < 8; i++ {
        go func() {
            for {
            }
        }()
    }
    select {}
}

func SleepWait(duration time.Duration) {
    fmt.Println("?")
    result := runtime.GOMAXPROCS(runtime.NumCPU() / 2)
    fmt.Println("result", result)
    done := make(chan bool)
    for i := 0; i < 8; i++ {
        go func() {
            defer fmt.Println("!!")
            for {
                select {
                case <-done:
                    return
                default:
                }
            }
        }()
    }
    fmt.Println("duration:", duration)
    <-time.After(duration)
    close(done)
    fmt.Println("??")
}
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2020-03-05,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档