Следите за новинками
в нашем Telegram канале. Жми, чтобы подписаться:)
⊗goSpGrSv 152 of 280 menu
◀ ▶

Несколько горутин в Go

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

Перед циклом запусков добавляют в группу столько ожиданий, сколько веток планируют. Каждая копия получает свой указатель на общую группу и отмечает готовность при выходе.

Три ветки с одним телом:

package main import ( "fmt" "sync" ) func worker(id int, wg *sync.WaitGroup) { defer wg.Done() fmt.Println("id", id) } func main() { var wg sync.WaitGroup wg.Add(3) go worker(1, &wg) go worker(2, &wg) go worker(3, &wg) wg.Wait() fmt.Println("all") }

Строки "id" с числами могут идти в разном порядке: планировщик решает, какая ветка успеет раньше. "all" печатается только после трех отметок Done.

Тот же прием в цикле:

package main import ( "fmt" "sync" ) func tick(n int, wg *sync.WaitGroup) { defer wg.Done() fmt.Println(n) } func main() { var wg sync.WaitGroup wg.Add(2) for i := 1; i <= 2; i++ { go tick(i, &wg) } wg.Wait() }

Дана функция:

func line(tag string, wg *sync.WaitGroup) { defer wg.Done() fmt.Println(tag) }

Запустите line два раза с разными метками "a" и "b" и дождитесь обеих веток.

Дан следующий код:

var wg sync.WaitGroup wg.Add(2) go worker(1, &wg) go worker(2, &wg) wg.Wait()

Скажите, сколько раз выполнится тело worker из урока.

Скажите, почему "all" из первого примера не печатается, пока не сработают все три отложенных Done.

← →
↑
Мы используем cookie для работы сайта, аналитики и персонализации. Обработка данных происходит согласно Политике конфиденциальности.
принять все настроить отклонить