W jaki sposób realizowana jest kontrola i koordynacja pracy goroutine w Go?
sobes.tech AI
Odpowiedź od AI
W Go kontrola i koordynacja goroutine odbywa się na kilka sposobów:
-
Kanały (channels) — główny mechanizm wymiany danych i synchronizacji między goroutine. Kanały pozwalają bezpiecznie przesyłać wartości i blokują nadawcę lub odbiorcę do momentu, aż będą gotowi.
-
sync.WaitGroup — służy do oczekiwania na zakończenie grupy goroutine. Pozwala głównej goroutine czekać, aż wszystkie uruchomione zakończą pracę.
-
Kontekst (context.Context) — używany do zarządzania czasem życia goroutine, przesyłania sygnałów anulowania i limitów czasowych.
-
Muteksy i inne prymitywy z pakietu sync — do ochrony zasobów współdzielonych i zapobiegania warunkom wyścigu.
Przykład z WaitGroup i kanałem:
var wg sync.WaitGroup
ch := make(chan int)
wg.Add(1)
go func() {
defer wg.Done()
ch <- 42 // wysyłanie wartości
}()
go func() {
val := <-ch // odbieranie wartości
fmt.Println(val)
}()
wg.Wait() // czekanie na zakończenie
W ten sposób, kombinacja kanałów i prymitywów synchronizacji pozwala efektywnie zarządzać równoległym wykonywaniem goroutine.