为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

Go
拉莫斯之舞 2023-06-12 09:57:41
我知道有多种不同的解决方案可以完成我正在寻找的事情,但我正在寻找一种/正确的方法来并行执行一些请求。我是 Go 的新手,但我现在正在做的事情感觉很麻烦。用例:我需要并行查询 4 个不同的 REST 端点(kubernetes 客户端请求)。一旦我得到所有这 4 个结果,我需要做一些处理。我的问题:我知道我需要为此使用 go 例程,但收集结果的最佳方式是什么。我现在正在做的事情(见下面的代码示例)可能非常麻烦,但我不确定我还能做些什么来改进代码。代码:这段代码最容易理解,但我不想按顺序执行请求:// Get node resource usage metricsnodeMetricsList, err := c.kubernetesClient.NodeMetricses()if err != nil {    log.Warn("Failed to get node usage list from Kubernetes", err)    return err}// Get pod resource usage metricspodMetricsList, err := c.kubernetesClient.PodMetricses()if err != nil {    log.Warn("Failed to get pod usage list from Kubernetes", err)    return err}这就是我并行运行请求的方式。这使得代码的可读性大大降低,而且实现起来也感觉非常麻烦:var nodeMetricsList *v1beta1.NodeMetricsListvar nodeMetricsListError errorvar podMetricsList *v1beta1.PodMetricsListvar podMetricsListError errorgo func() {    nodeMetricsList, nodeMetricsListError = c.kubernetesClient.NodeMetricses()}()if nodeMetricsListError != nil {    log.Warn("Failed to get podList from Kubernetes", err)    return err}// Get pod resource usage metricsgo func() {    podMetricsList, podMetricsListError = c.kubernetesClient.PodMetricses()}()if podMetricsListError != nil {    log.Warn("Failed to get pod usage list from Kubernetes", err)    return err}并行执行给定示例中的请求的正确方法是什么?
查看完整描述

1 回答

?
斯蒂芬大帝

TA贡献1827条经验 获得超8个赞

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


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


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")


查看完整回答
反对 回复 2023-06-12
  • 1 回答
  • 0 关注
  • 129 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信