我目前有多个具有相同功能的goroutine,需要在执行的某个时刻等待程序单独部分的结果,然后才能继续。我首先想到的是为每个goroutine都提供一个通道,然后一旦获得结果,我们便会遍历所有通道,将其写入并在之后关闭?
如何有效/有效地与goroutine共享结果?在继续执行下一部分之前,是否是写入他们正在监听/阻止的各自频道的唯一方法?似乎有点多余。
谢谢
答案 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)
之所以起作用,是因为在封闭的通道上接收会返回通道类型的零值。
答案 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()
}