gpt4 book ai didi

concurrency - 在 Golang 中同时读取多个 channel

转载 作者:IT老高 更新时间:2023-10-28 13:10:09 24 4
gpt4 key购买 nike

我是 Golang 的新手。现在我正在尝试弄清楚如何在 Golang 中创建一个任意对一的 channel ,其中设置如下:

假设我有两个 goroutine numgen1 和 numgen2 同时执行并将数字分别写入 channel num1。编号2。我想在一个新进程 addnum 中添加从 numgen1 和 numgen2 发送的数字。我尝试过这样的事情:

func addnum(num1, num2, sum chan int) {
done := make(chan bool)
go func() {
n1 := <- num1
done <- true
}()
n2 := <- num2
<- done
sum <- n1 + n2
}

但这似乎很不正确。有人可以给我一些想法吗?

非常感谢您的帮助。

最佳答案

根据您的要求,您可能需要在每次迭代时阅读两个 channel (即某种“zip”功能)。您可以通过选择来执行此操作,类似于 user860302的答案:

func main() {

c1 := make(chan int)
c2 := make(chan int)
out := make(chan int)

go func(in1, in2 <-chan int, out chan<- int) {
for {
sum := 0
select {
case sum = <-in1:
sum += <-in2

case sum = <-in2:
sum += <-in1
}
out <- sum
}
}(c1, c2, out)
}

这将永远运行。我首选的终止像这样的 goroutine 的方法是关闭输入 channel 。在这种情况下,您需要等待两者都关闭,然后 close(out) 再终止。

提示:注意使用定向 channel 作为 goroutine 形式参数。当您以这种方式编写时,编译器会捕获更多错误。幸福!

关于concurrency - 在 Golang 中同时读取多个 channel ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20593126/

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