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:
-
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.
-
Utilizarea
sync.WaitGrouppentru 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.