Несколько горутин в 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.