Goroutine在频道上收听相同的结果

时间:2019-10-06 00:40:45

标签: go goroutine

我目前有多个具有相同功能的goroutine,需要在执行的某个时刻等待程序单独部分的结果,然后才能继续。我首先想到的是为每个goroutine都提供一个通道,然后一旦获得结果,我们便会遍历所有通道,将其写入并在之后关闭?

如何有效/有效地与goroutine共享结果?在继续执行下一部分之前,是否是写入他们正在监听/阻止的各自频道的唯一方法?似乎有点多余。

谢谢

2 个答案:

答案 0 :(得分:2)

使用close通道来协调等待事件的多个goroutine。

这是一个例子。 printer函数表示等待结果的goroutine。第一个参数是设置结果后将关闭的通道。第二个参数是指向结果的指针。

func printer(ready chan struct{}, result *string) {
    <-ready
    fmt.Println(*result)
}

像这样使用它:

ready := make(chan struct{})
var result string

// Start the goroutines.

go printer(ready, &result)
go printer(ready, &result)

// Set the result and close the channel to signal that the value is ready.

result = "Hello World!"
close(ready)

之所以起作用,是因为在封闭的通道上接收会返回通道类型的零值。

Run it on the playground

答案 1 :(得分:1)

您可以代替将结果发送到每个goroutine的通道,而可以将结果存储到共享变量,并使用条件变量来广播结果已准备好,因此所有goroutine都可以从共享变量中读取结果。 / p>

类似这样的东西:

var resultVar *ResultType // resultVar = nil means result not ready
var c sync.Cond // initialize this before using it

func f() {
  // compute result
  c.L.Lock()
  resultVar = result
  c.L.Unlock()
  c.Broadcast()
}

func goroutine() {
  ...
  c.L.Lock()
  for resultVar == nil {
    c.Wait()
  }
  c.L.Unlock()
}