Sobes.tech
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:

  1. 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.

  2. Gebruik van sync.WaitGroup voor 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.