我有一个循环抛出多个go例程,他们调用一个函数使http获取请求并计算和反对。
我想恢复所有这些例程的结果。 我尝试使用频道,但是他们是空的,即使我强迫等待所有例程完成。
这是启动例程的代码:
c <- res
在getScore()结束时,我这样做,c是函数中通道的名称,res是函数的结果
localhost
两个打印件中通道的长度均为0。
获得功能结果的最佳方式是什么?
答案 0 :(得分:0)
c := make(chan result)
创建无缓冲的频道。因此发送语句,例如
c <- res
在另一个goroutine尝试接收操作之前无法继续。
换句话说,执行主goroutine中接收操作的次数,以匹配将从其他goroutine尝试的发送次数。像这样:
for _, product := range pairs {
go getScore(product.Symbol, 1, c)
}
for x := 0; x < len(pairs); x++ {
fmt.Println(<-c)
}
有关详细信息,请参阅the Go Tour section on channels和the Effective Go section on channels。
答案 1 :(得分:0)
通道是针对共享内存的同步原型(从简单的角度来看)。缓冲通道具有长度但不是常规通道。缓冲通道在一些小的情况下很有用,但不是一般方法。
通过对或len对的范围添加循环的最简单方法:
// 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()