关于Goroutine执行顺序

下面这段代码在设置了GOMAXPROCS为1后,为什么执行的结果是先打印出b,再打印出a,难道不是顺序执行吗?(go 版本:1.8)

func main() {
    runtime.GOMAXPROCS(1)
    var wg sync.WaitGroup
    wg.Add(2)
    go func() {
        fmt.Println("a")
        wg.Done()
    }()
    go func() {
        fmt.Println("b")
        wg.Done()
    }()
    wg.Wait()
}
已邀请:

simple - 既要有梦想,又要有实力

赞同来自: suc tanteng

我以前回答过 链接:这个问题 , 要想理解还是要看看Go并发调度器的实现的,雨痕老师的《Go语言学习笔记》是很好的资料。

yate1996

赞同来自:

同问~

SunisDown - @douban

赞同来自:

不是顺序执行。

TavenLi

赞同来自:

在只有一个CPU工作的时候,永远是最后一个先执行 剩下的按顺序执行 怪怪的

cloverstd -

赞同来自:

因为 main 也是放在 goroutine 里执行的

tanteng - https://tanteng.me

赞同来自:

同问,有终结答案吗

tanteng - https://tanteng.me

赞同来自:

https://play.golang.org/p/UrUk7Agefo

正准备问这个问题

package main

import (
    "fmt"
    "runtime"
    "sync"
)

var wg sync.WaitGroup

func main() {
    runtime.GOMAXPROCS(1)

    wg.Add(100)

    for i := 1; i <= 100; i++ {
        go test(i)
    }

    wg.Wait()
}

func test(index int) {
    fmt.Println(index)
    wg.Done()
}

要回复问题请先登录注册