我有一个循环抛出多个 go 例程,它们调用一个函数来生成 http get 请求并计算和对象。
我想恢复所有这些例程的结果。 我尝试使用 channel ,但是它们是空的,即使我强制等待所有例程完成也是如此。
这是启动例程的代码:
func main() {
pairs := getPairs() //Returns an array of strings
c := make(chan result)
for _, product := range pairs {
go getScore(product.Symbol, 1, c)
}
fmt.Println(len(c))
time.Sleep(5000 * time.Millisecond)
fmt.Println(len(c))
}
在 getScore() 的最后,我这样做,c 是函数中 channel 的名称,res 是函数的结果
c <- res
channel 的长度在两个打印中都是 0。
获取函数结果的最佳方法是什么?
最佳答案
channel 是针对共享内存的同步原型(prototype)(从简单的角度来看)。缓冲 channel 有长度但不是常规 channel 。缓冲 channel 在少量情况下很有用,但不是一般方法。
只需按对的范围或对的长度添加循环的最简单方法:
// start processing
for _, product := range pairs {
go getScore(product.Symbol, 1, c)
}
// getting a result
for i:=0; i<len(pairs); i ++ {
result := <-c
// process a result value
}
或者另一种方法是在另一个灌浆中收集结果:
// result and sync variable
var (
wait sync.WaitGroup
result int32
)
// start processing
for _, product := range pairs {
wait.Add(1)
go getScore(product.Symbol, 1, c)
go func() {
defer wait.Done()
// simple accumulate or maybe more complicated actions
atomic.AddInt32(&result, <-c)
}()
}
// wait finishing
wait.Wait()
关于go - 如何恢复循环中调用的多个go例程的输入,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48977835/