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

标签 concurrency go channels

我是 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/

相关文章:

Java 并发 : Countdown latch vs Cyclic barrier

c++ - C++ STL (ExecutionPolicy) 算法如何确定使用多少并行线程?

go - 带 channel 的 WaitGroup

django - Django-channels可以与 celery 共存吗

go - : variable <-struct {}{}的含义

java - 异步通知 BlockingQueue 有可用项

java - ExecutorService 占用内存过多

php - golang 相当于 PHP crypt()

datetime - 计算以年、日、小时、分钟等为单位的两个日期之间的差值

multithreading - RabbitMQ - 关闭空闲/悬空 channel