Идиоматический параллелизм в Go - PullRequest
1 голос
/ 25 сентября 2019

Я пытаюсь правильно структурировать довольно большой процесс в Go.Я сделал это таким образом, чтобы это заняло несколько секунд, а не минут на другом языке;однако я не уверен, что делаю это правильно в идиоматическом смысле.

Вот общий обзор процесса:

Процесс 1 - Основной

  1. Получение токена из удаленного API (не одновременный)
  2. Список всех идентификаторов основных ресурсов из API (не одновременный)
  3. Для каждого идентификатора ресурса запускается Процесс 2
  4. Отображение результатов в журналах / CLI

Процесс 2 - Данные уровня 2

  1. Поиск идентификатора ресурса второго уровнясписок на основе входящего родительского идентификатора
  2. Для каждого идентификатора ресурса запускается процесс 3

процесс 3 - данные уровня 3

  1. Поиск данных, соответствующих определенному термину для содержимого объекта уровня 2
  2. Для каждого термина ищите его дескриптор и собирайте конкретные сведения
  3. Агрегируйте результаты

То, что я сделал до сих пор, - это WaitGroup для Процесс 2 и Процесс 3 .

Мой процесс верхнего уровняss выглядит примерно так:

tier2Ids := getTier2IdSlice()
results := &MyResultStruct{}

waitGroup.Add(len(tier2Ids))
for _, id := range tier2Ids {
    go inspectTier2(id, results, &waitGroup)
}
waitGroup.Wait()

Я передаю указатель на результаты, и пока программа обновляет данные там.Если я рефакторинг, я это исправлю.Исходя из другого языка, это имеет смысл для меня и прекрасно работает, но что-то не так в Go.

Есть ли более идиоматический подход, который я могу использовать?

...