go - 同一 Channel 中的两个 goroutine - 它们是如何执行的?

标签 go goroutine

当我从 golang.org 浏览 Golang 时,有一个代码片段我不明白:

func sum(a []int, c chan int, order int) {
    sum := 0
    for _, v := range a {
        sum += v
    }
    fmt.Println(order, a)
    c <- sum // 将和送入 c
}

func main() {
    a := []int{7, 2, 8, -9, 4, 0}

    c := make(chan int)
    a1, a2 := a[:len(a)/2], a[len(a)/2:]

    go sum(a1, c, 1)
    x := <-c
    go sum(a2, c, 2)
    y := <-c
    //x := <-c
    //y := <-c
    // x, y := <-c, <-c // 从 c 中获取

    fmt.Println(x, y, x+y)
}

这是我期望的输出:

1 [7 2 8]
2 [-9 4 0]
17 -5 12

当我更改代码时:

func main() {
    a := []int{7, 2, 8, -9, 4, 0}

    c := make(chan int)
    a1, a2 := a[:len(a)/2], a[len(a)/2:]

    go sum(a1, c, 1)
    //x := <-c
    go sum(a2, c, 2)
    //y := <-c
    x := <-c
    y := <-c
    // x, y := <-c, <-c // 从 c 中获取

    fmt.Println(x, y, x+y)
}

为什么输出是这样的:

2 [-9 4 0] 
1 [7 2 8]
-5 17 12

最佳答案

问题是你错过了并发的概念 无法保证按照 go 调用函数的确切顺序执行函数

第一个代码片段有序工作的原因是 x := <-c部分 此行强制您的应用程序等待 c channel 充满数据,这样第二个 goroutine 就不会被调用

关于go - 同一 Channel 中的两个 goroutine - 它们是如何执行的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46640390/

相关文章:

go - 增加最大分配内存 Golang 1.4+

goroutine 上下文取消 panic

regex - Go:处理多行命令输出并解析

go - 如何从 Golang 中的一系列随机数中进行选择?

macos - golang 1.16 cgo/clang 在 darwin/arm64 上构建失败

go - 为什么goroutines没有 `.join`操作?

go - 如何动态决定处理任务的 goroutines 数量

go - golang中的函数类型参数匹配

go - 使用 gorutine (golang) 的无效内存地址

go - 有没有一种方法可以优化该代码? Go中的TCP服务器