решение для гонки на горутинах - PullRequest
0 голосов
/ 29 марта 2019

Я пытаюсь понять, как я могу исправить это состояние гонки для приведенного ниже кода.

sayHello := func() {
    fmt.Println("Hello from goroutine")
}

go sayHello()
time.Sleep(1)

fmt.Println("Hello, playground")

Ожидание : я просто хочу знать, какое решение лучше, если я буду использоватьWaitGroup или есть какое-то лучшее решение?

Итак, я придумала следующее решение:

var wg sync.WaitGroup
//defer wg.Wait()
sayHello := func() {
    defer wg.Done()
    fmt.Println("Hello from goroutine")
}
wg.Add(1)

go sayHello()
wg.Wait()

fmt.Println("Hello, playground")

Но это блокирует основную программу, пока код не будет выполнен!

Также, если я использую defer wg.Wait(), вывод будет другим!https://play.golang.org/p/_xkLb7HvNF8

Состояние гонки. Я имел в виду, что go sayHello() никогда даже не выполняется, потому что основной функционал завершится еще до того, как программа была запущена.Следовательно, это создает условия гонки, если я пытаюсь поставить время. Сон

1 Ответ

3 голосов
/ 29 марта 2019

В вашем коде нет условия гонки .

Первый вопрос

Но это блокирует основную программу, пока код не будет выполнен!

Вы используете сразу после sayHello вызова:

wg.Wait()

Это блокирует ваш код и ждет, пока выполнение программы не будет выполнено. Таким образом, go sayHello() будет печатать "Hello from goroutine" всегда до "Hello, playground".

См. Документацию здесь :

Ожидать блоки, пока счетчик WaitGroup не станет равным нулю.

Второй вопрос

Также, если я использую defer wg.Wait (), результат будет другим!

Да, в этом случае wg.Wait() будет выполнено перед выходом из основной функции. Это означает, что sayHello() будет печатать "Hello from goroutine" до или после "Hello, playground" - это зависит от Планировщик Go

Подробнее о defer здесь

Оператор defer помещает вызов функции в список. Список сохраненных вызовов выполняется после возврата окружающей функции. Defer обычно используется для упрощения функций, выполняющих различные действия по очистке.

Обновление:

Использование WaitGroup рекомендуется по сравнению с другим решением с использованием каналов. Вы должны использовать wg.Wait() в нужном месте для достижения ожидаемого результата (все еще не предоставлен).

...