Go协程执行顺序不确定:同一个代码会输出两种不同结果,为什么?

go协程执行顺序不确定:同一个代码会输出两种不同结果,为什么?

协程执行的不确定性

在面试中,可能会遇到如下问题:

package main

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

func main() {
    runtime.gomaxprocs(1)
    wg := sync.waitgroup{}
    wg.add(10)
    for i := 0; i < 5; i++ {
        go func() {
            fmt.println("a:", i)
            wg.done()
        }()
    }
    for i := 0; i < 5; i++ {
        go func(num int) {
            fmt.println("b:", num)
            wg.done()
        }(i)
    }
    wg.wait()
}

代码会输出什么结果?

首先要明确,在 go 语言中协程的执行顺序是不确定的。因此,代码可能呈现以下两种输出结果之一:

a: 5
a: 5
a: 5
a: 5
a: 5
b: 0
b: 1
b: 2
b: 3
b: 4

或者

B: 4
A: 5
A: 5
A: 5
A: 5
A: 5
B: 0
B: 1
B: 2
B: 3

go 官方文档明确表示,协程的调度顺序是未定义的,因此不应该依赖特定顺序编写代码。虽然在特定环境下代码可能表现出特定的输出顺序,但这不是编程实践中的好做法。始终将协程执行顺序视为不可预测。

以上就是Go协程执行顺序不确定:同一个代码会输出两种不同结果,为什么?的详细内容,更多请关注其它相关文章!