Правильный способ выполнять разные запросы параллельно - PullRequest
0 голосов
/ 21 февраля 2019

Я знаю, что есть несколько различных решений для того, что я ищу, но я ищу / правильный способ выполнять некоторые запросы параллельно.Я новичок в 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
}

Как правильно выполнять запросы в моем примере параллельно?

1 Ответ

0 голосов
/ 21 февраля 2019

Ваш код имеет 2 состояния гонки и, вероятно, никогда не будет правильно сообщать об ошибке.

Вам нужно дождаться завершения выполнения процедур, прежде чем вы сможете прочитать значения, с которыми они работают, что легко сделать с помощью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")
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...