golang - 一道流传的go面试题

查看:232
本文介绍了golang - 一道流传的go面试题的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

问 题

func test_gomaxprocs() {
    runtime.GOMAXPROCS(1)
    wg := sync.WaitGroup{}
    wg.Add(20)

    for i := 0; i < 10; i++ {
        go func() {
            fmt.Println("i:", i)
            defer wg.Done()
        }()
    }
    for i := 0; i < 10; i++ {
        go func(i int) {
            fmt.Println("j: ", i)
            defer wg.Done()
        }(i)
    }
    //sleep
    wg.Wait()
}

我google到一个外国人写的文章,说设置CPU数目为1后,go语句函数是按顺序依次执行的。 我在wg.Wait()前sleep下,得到的输出确实是依次执行的。但是我疑惑的是,为什么已进入wg.Wait(),go语句函数的执行顺序就乱了呢?

解决方案

这个问题,time.Sleep应该是在main goroutine里执行的,至于顺序是goroutine内部调度问题,CPU到底分给了哪个goroutine这个内部控制的。这个结果和是否执行sleep应该没有必然的联系。
至于Go的调度器相关,可以看下这个文档:https://www.douban.com/note/3...

这篇关于golang - 一道流传的go面试题的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆