go - 将 go 例程的多个结果聚合到一个数组中

标签 go channels

我有以下函数可以派生出一定数量的 go 例程

func (r *Runner) Execute() {
    var wg sync.WaitGroup
    wg.Add(len(r.pipelines))
    for _, p := range r.pipelines {
        go executePipeline(p, &wg)
    }

    wg.Wait()

    errs := ....//contains list of errors reported by any/all go routines

}

我在想 channel 可能有某种方式,但我似乎无法弄清楚。

最佳答案

如果可以使 executePipeline 返回错误,一种方法是使用互斥体:

// ...
for _, p := range r.pipelines {
    go func(p pipelineType) {
        if err := executePipeline(p, &wg); err != nil {
            mu.Lock()
            errs = append(errs, err)
            mu.UnLock()
        }
    }(p)
}

要使用 channel ,您可以有一个单独的 goroutine 错误列表:

errCh := make(chan error)

go func() {
    for e := range errCh {
        errs = append(errs, e)
    }
}

并在 Execute 函数中,进行以下更改:

// ...
wg.Add(len(r.pipelines))
for _, p := range r.pipelines {
    go func(p pipelineType) {
        if err := executePipeline(p, &wg); err != nil {
            errCh <- err
        }
    }(p)
}

wg.Wait()
close(errCh)

如果 goroutine 的数量不多,你总是可以使用上面列出的 @zerkms 方法。

无需从 executePipleline 返回错误并使用匿名函数包装器,您始终可以在函数本身内进行上述更改。

关于go - 将 go 例程的多个结果聚合到一个数组中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45725688/

相关文章:

go - Go 函数中返回变量的个数可变

java - Netty - 如何测试客户端/服务器版本号

go - 如何保护(混淆)Go 二进制文件不被破解

c - XMPP 服务器的 libxml2 与 expat

go - 当 defer func 在 ginkgo 执行时

java - Netty:关闭 channel 时出现 ClosedChannelException

python - Pytest 测试在与其他测试一起运行时失败,但在单独运行时通过

go - 软件包handlers/gql.go不在GOROOT中(/usr/local/go/src/handlers/gql.go)

java - 通过 ReadableByteChannel 的 InputStream 没有读到结束

Django Channels 从 Celery 任务发送组消息。异步事件循环在所有异步任务完成之前停止