Какой синтаксис является предпочтительным для запуска кода параллельно с goroutine? - PullRequest
0 голосов
/ 26 ноября 2018

Допустим, мне нужно вызвать функцию дважды.Обычный способ сделать это будет:

func main() {
    var wg sync.WaitGroup
    wg.Add(2)

    go func() {
        doSomething(A)          
        wg.Done()
    }()

    go func() {
        doSomething(B)
        wg.Done()
    }()
    wg.Wait()
}

Но как насчет того, чтобы написать это так?

func main() {
    var wg sync.WaitGroup
    wg.Add(2)

    go func() {
        doSomething(A)          
        wg.Done()
    }()

    doSomething(B)
    wg.Done()
    wg.Wait()
}

Мы избавляемся от создания одной программы, используя основныеgoroutine.Но я никогда не видел такого написанного в любом урокеЭто неправильно делать это?Я сделал тесты, и результат такой же, как и я, но тот же.

1 Ответ

0 голосов
/ 26 ноября 2018

Оба верны.Первая форма является более чистой и хорошо масштабируется, если вы собираетесь расширить свой код позже, например, если вы позже решите, что хотите запускать не 2, а 3, 4 или N процедур, код не изменится по структуре, вы просто добавите дополнительные программы.

Еще одна причина, по которой первая форма является "популярной", заключается в том, что часто после запуска "рабочих" подпрограмм можно выполнять больше действий, которые могут быть выполнены в этой подпрограмме (до вызова wg.Done()).

Вторая форма, с другой стороны, более эффективна, так как она запускает только одну дополнительную программу.Горутины легкие, дешевые, но они не «бесплатны».Это может быть улучшено дополнительно с помощью WaitGroup только для «отслеживания» запущенной программы, очевидно, «основной», который вызывает wg.Wait(), не должен явно ожидать себя.И если останется только 1 процедура, вы можете использовать другие средства синхронизации вместо WaitGroup (например, канал).

Таким образом, в основном, если производительность критична, используйте 2-й подход.

...