gpt4 book ai didi

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

转载 作者:IT王子 更新时间:2023-10-29 01:53:38 24 4
gpt4 key购买 nike

我知道有多种不同的解决方案可以满足我的需求,但我正在寻找一种/正确的方法来并行执行一些请求。我是 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
}

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

最佳答案

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

您需要等待 goroutine 完成,然后才能读取它们操作的值,这可以通过 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")

关于go - 并行执行不同请求的正确方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54816055/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com