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

我知道有多种不同的解决方案可以完成我正在寻找的事情,但我正在寻找一种/正确的方法来并行执行一些请求。我是 Go 的新手,但我现在正在做的事情感觉很麻烦。


用例:


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


我的问题:


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


代码:


这段代码最容易理解,但我不想按顺序执行请求:


// 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

}

这就是我并行运行请求的方式。这使得代码的可读性大大降低,而且实现起来也感觉非常麻烦:


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

}

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


拉莫斯之舞
浏览 130回答 1
1回答

斯蒂芬大帝

您的代码有 2 个竞争条件,并且可能永远不会正确报告错误。您需要等待 goroutines 完成,然后才能读取它们操作的值,这很容易完成,如下所示sync.WaitGroup:var nodeMetricsList *v1beta1.NodeMetricsListvar podMetricsList *v1beta1.PodMetricsListvar nodeMetricsListError, podMetricsListError errorvar wg sync.WaitGroup// Get node resource usage metricswg.Add(1)go func() {    defer wg.Done()    nodeMetricsList, nodeMetricsListError = c.kubernetesClient.NodeMetricses()}()// Get pod resource usage metricswg.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")
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go