Sobes.tech
Junior — Middle

Cum se implementează citirea sigură a datelor dintr-un canal în mai multe goroutines în același timp?

sobes.tech AI

Răspuns de la AI

În Go, pentru citirea sigură dintr-un canal de către mai multe goroutines în același timp, de obicei se utilizează una dintre următoarele abordări:

  1. Un emițător, mai mulți receptori — se creează un canal și mai multe goroutines citesc din el. Canalul în Go este sigur pentru citirea simultană de către mai multe goroutines, așa că se pot porni mai multe goroutines care citesc din același canal.

  2. Utilizarea sync.WaitGroup pentru sincronizare — pentru a aștepta finalizarea tuturor goroutine-urilor.

Exemplu:

package main

import (
    "fmt"
    "sync"
)

func worker(id int, ch <-chan int, wg *sync.WaitGroup) {
    defer wg.Done()
    for val := range ch {
        fmt.Printf("Lucrător %d a primit %d\n", id, val)
    }
}

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

    // Pornim 3 goroutine-uri care citesc din canal
    for i := 1; i <= 3; i++ {
        wg.Add(1)
        go worker(i, ch, &wg)
    }

    // Trimitem date în canal
    for i := 0; i < 10; i++ {
        ch <- i
    }
    close(ch) // Închidem canalul pentru a termina goroutine-urile

    wg.Wait() // Așteptăm finalizarea tuturor goroutine-urilor
}

Astfel, canalul în Go asigură deja un acces sigur la citire din mai multe goroutine-uri, principalul fiind să gestionăm corect ciclul lor de viață și să închidem canalul.