Sobes.tech
Junior — Middle

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.