首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >并行执行不同请求的正确方法

并行执行不同请求的正确方法
EN

Stack Overflow用户
提问于 2019-02-22 04:54:02
回答 1查看 53关注 0票数 1

我知道有多个不同的解决方案可以做我正在寻找的事情,但我正在寻找一种/正确的方式来并行执行一些请求。我是新来的,但我现在做的事情感觉很繁琐。

使用案例:

我需要并行查询4个不同的REST端点(kubernetes客户端请求)。一旦我得到了所有这4个结果,我需要做一些处理。

My problem:

我知道我需要使用go例程,但是收集结果的最佳方式是什么呢?我目前正在做的事情(参见下面的代码示例)可能非常繁琐,但我不确定还能做些什么来改进代码。

代码:

下面的代码是最容易理解的,但我不想按顺序执行请求:

代码语言:javascript
复制
// Get node resource usage metrics
nodeMetricsList, err := c.kubernetesClient.NodeMetricses()
if err != nil {
    log.Warn("Failed to get node usage list from Kubernetes", err)
    return err
}

// Get pod resource usage metrics
podMetricsList, err := c.kubernetesClient.PodMetricses()
if err != nil {
    log.Warn("Failed to get pod usage list from Kubernetes", err)
    return err
}

这就是我并行运行请求的方式。这使得代码的可读性变得很差,而且实现起来也很麻烦:

代码语言:javascript
复制
var nodeMetricsList *v1beta1.NodeMetricsList
var nodeMetricsListError error
var podMetricsList *v1beta1.PodMetricsList
var podMetricsListError error

go func() {
    nodeMetricsList, nodeMetricsListError = c.kubernetesClient.NodeMetricses()
}()
if nodeMetricsListError != nil {
    log.Warn("Failed to get podList from Kubernetes", err)
    return err
}

// Get pod resource usage metrics
go func() {
    podMetricsList, podMetricsListError = c.kubernetesClient.PodMetricses()
}()
if podMetricsListError != nil {
    log.Warn("Failed to get pod usage list from Kubernetes", err)
    return err
}

并行执行给定示例中的请求的正确方法是什么?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-02-22 04:59:54

您的代码有两个争用条件,并且可能永远不会正确地报告错误。

您需要等待goroutines完成,然后才能读取它们所操作的值,这很容易使用如下所示的sync.WaitGroup完成:

代码语言:javascript
复制
var nodeMetricsList *v1beta1.NodeMetricsList
var podMetricsList *v1beta1.PodMetricsList
var nodeMetricsListError, podMetricsListError error
var wg sync.WaitGroup

// Get node resource usage metrics
wg.Add(1)
go func() {
    defer wg.Done()
    nodeMetricsList, nodeMetricsListError = c.kubernetesClient.NodeMetricses()
}()

// Get pod resource usage metrics
wg.Add(1)
go func() {
    defer wg.Done()
    podMetricsList, podMetricsListError = c.kubernetesClient.PodMetricses()
}()

wg.Wait()
if nodeMetricsListError != nil {
    log.Warn("Failed to get podList from Kubernetes", err)
    return err
}
if podMetricsListError != nil {
    log.Warn("Failed to get pod usage list from Kubernetes", err)
    return err
}

fmt.Println("Hello, playground")
票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/54816055

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档