我正在尝试并发,并且尝试了一些模式。 我正在尝试这样做,您收到一组元素,同时处理它们并对所有结果求和。 我使用 2 个通道,一个用于处理数组,另一个用于对结果求和。 为了同步这一点,我使用等待组来等待所有元素都被处理,然后关闭通道。 但令我惊讶的是,当这段代码打印出 0 时。 我是新手,但我不明白为什么它打印 0。 有人可以解释一下吗?
package main
import (
"fmt"
"sync"
)
func main() {
input := []int{1, 2, 3, 4, 5}
c := make(chan int)
result := make(chan int)
var wg sync.WaitGroup
go process_all(input, c, &wg)
go sum_results(c, result)
wg.Wait()
close(c)
sum := <- result
fmt.Println(sum)
}
func sum_results(c chan int, res chan int) {
var sum int
for result := range c {
sum += result
}
res <- sum
}
func process_all(inputs []int, c chan int, wg *sync.WaitGroup) {
wg.Add(len(inputs) + 1)
defer wg.Done()
for input := range inputs {
go process_input(input, c, wg)
}
}
func process_input(input int, c chan int, wg *sync.WaitGroup) {
defer wg.Done()
c <- input * 2
}
我希望打印 20
我可以看到你的程序中有两个错误。首先,您在第一个 goroutine 中调用
wg.Add
,因此不能保证当您 wg.Wait
时它被调用,从而在添加任何内容之前关闭通道 c。其次,inputs
上的范围给出了索引而不是切片中的值。