如何恢复循环中调用的多个go例程的输入

时间:2018-02-25 19:58:51

标签: go channels routines

我有一个循环抛出多个go例程,他们调用一个函数使http获取请求并计算和反对。

我想恢复所有这些例程的结果。 我尝试使用频道,但是他们是空的,即使我强迫等待所有例程完成。

这是启动例程的代码:

c <- res

在getScore()结束时,我这样做,c是函数中通道的名称,res是函数的结果

localhost

两个打印件中通道的长度均为0。

获得功能结果的最佳方式是什么?

2 个答案:

答案 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 channelsthe 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()