Junior — Middle
Hoe implementeer je veilige gegevenslezing uit een kanaal in meerdere goroutines tegelijk?
sobes.tech AI
Antwoord van AI
In Go wordt voor veilig lezen uit een kanaal door meerdere goroutines tegelijk meestal een van de volgende benaderingen gebruikt:
-
Eén zender, meerdere ontvangers — een kanaal wordt gemaakt en meerdere goroutines lezen ervan. Het kanaal in Go is veilig voor gelijktijdig lezen door meerdere goroutines, dus je kunt gewoon meerdere goroutines starten die uit hetzelfde kanaal lezen.
-
Gebruik van
sync.WaitGroupvoor synchronisatie — om te wachten tot alle goroutines klaar zijn.
Voorbeeld:
package main
import (
"fmt"
"sync"
)
func worker(id int, ch <-chan int, wg *sync.WaitGroup) {
defer wg.Done()
for val := range ch {
fmt.Printf("Werker %d ontving %d\n", id, val)
}
}
func main() {
ch := make(chan int)
var wg sync.WaitGroup
// Start 3 goroutines die uit het kanaal lezen
for i := 1; i <= 3; i++ {
wg.Add(1)
go worker(i, ch, &wg)
}
// Stuur data naar het kanaal
for i := 0; i < 10; i++ {
ch <- i
}
close(ch) // Sluit het kanaal zodat de goroutines eindigen
wg.Wait() // Wacht tot alle goroutines klaar zijn
}
Op deze manier zorgt het kanaal in Go al voor veilige toegang bij het lezen door meerdere goroutines, het belangrijkste is om hun levenscyclus correct te beheren en het kanaal te sluiten.