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

标签 go channels routines

我有一个循环抛出多个 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/

相关文章:

go - 当 channel 关闭时,以接收 channel 作为参数的 goroutines 是否停止?

java - TALEND 根据 TalendDate 设置上下文变量

mysql - 为什么这个 mysql 例程总是在 XAMPP 的 phpmyadmin sql 控制台中返回 false?

mysql - 根据创建者导出具有不同访问权限的MYSQL函数

string - Go语言是否对字符串使用Copy-on-write

go - 无法打开应该位于基本路径中的文件

websocket - 如何检测用户是否因网络断开而离开 Phoenix channel ?

json - 如何解码转义的 JSON 字符串

c++ - 寻找提供类似于 Google Go channel 功能的 C 或 C++ 库

python - 停留在 AsyncWebsocketConsumer 实现