我知道有多个不同的解决方案可以做我正在寻找的事情,但我正在寻找一种/正确的方式来并行执行一些请求。我是新来的,但我现在做的事情感觉很繁琐。
使用案例:
我需要并行查询4个不同的REST端点(kubernetes客户端请求)。一旦我得到了所有这4个结果,我需要做一些处理。
My problem:
我知道我需要使用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
}
并行执行给定示例中的请求的正确方法是什么?
发布于 2019-02-22 04:59:54
您的代码有两个争用条件,并且可能永远不会正确地报告错误。
您需要等待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")
https://stackoverflow.com/questions/54816055
复制相似问题