Sobes.tech
Junior — Middle

Ako implementovať bezpečné čítanie dát z kanála vo viacerých goroutines naraz?

sobes.tech AI

Odpoveď od AI

V jazyku Go sa pre bezpečného čítania z kanála od viacerých gorutín súčasne zvyčajne používajú jeden z nasledujúcich prístupov:

  1. Jeden odosielateľ, viacerí prijímatelia — vytvorí sa kanál a niekoľko gorutín z neho číta. Kanál v Go je bezpečný pre súčasné čítanie z viacerých gorutín, takže je možné spustiť niekoľko gorutín, ktoré čítajú z toho istého kanála.

  2. Použitie sync.WaitGroup na synchronizáciu — na počkanie, kým všetky gorutiny neskončia.

Príklad:

package main

import (
    "fmt"
    "sync"
)

func worker(id int, ch <-chan int, wg *sync.WaitGroup) {
    defer wg.Done()
    for val := range ch {
        fmt.Printf("Pracovník %d prijal %d\n", id, val)
    }
}

func main() {
    ch := make(chan int)
    var wg sync.WaitGroup

    // Spustíme 3 gorutiny, ktoré čítajú z kanála
    for i := 1; i <= 3; i++ {
        wg.Add(1)
        go worker(i, ch, &wg)
    }

    // Posielame dáta do kanála
    for i := 0; i < 10; i++ {
        ch <- i
    }
    close(ch) // Zatvárame kanál, aby gorutiny skončili

    wg.Wait() // Čakáme na dokončenie všetkých gorutín
}

Týmto spôsobom už kanál v Go zabezpečuje bezpečný prístup pri čítaní z viacerých gorutín, hlavné je správne riadiť ich životný cyklus a zatvoriť kanál.