gpt4 book ai didi

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

转载 作者:IT王子 更新时间:2023-10-29 01:35:09 25 4
gpt4 key购买 nike

当我从 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com