Junior — Middle
Kako implementirati sigurnu čitanje podataka iz kanala u više gorutina istovremeno?
sobes.tech АИ
Одговор од АИ
U Go jeziku, za sigurnu čitanje iz kanala od strane više gorutina istovremeno, obično se koriste jedan od sledećih pristupa:
-
Jedan pošiljalac, više primaoca — kreira se kanal i više gorutina čitaju iz njega. Kanal u Go je siguran za istovremeno čitanje od strane više gorutina, pa je dovoljno pokrenuti više gorutina koje čitaju iz istog kanala.
-
Korišćenje
sync.WaitGroupza sinhronizaciju — da se sačeka završetak svih gorutina.
Primer:
package main
import (
"fmt"
"sync"
)
func worker(id int, ch <-chan int, wg *sync.WaitGroup) {
defer wg.Done()
for val := range ch {
fmt.Printf("Radnik %d primio %d\n", id, val)
}
}
func main() {
ch := make(chan int)
var wg sync.WaitGroup
// Pokrećemo 3 gorutine koje čitaju iz kanala
for i := 1; i <= 3; i++ {
wg.Add(1)
go worker(i, ch, &wg)
}
// Šaljemo podatke u kanal
for i := 0; i < 10; i++ {
ch <- i
}
close(ch) // Zatvaramo kanal da bi gorutine završile
wg.Wait() // Čekamo da se sve gorutine završe
}
Na ovaj način, kanal u Go već obezbeđuje siguran pristup pri čitanju iz više gorutina, važno je pravilno upravljati njihovim životnim ciklusom i zatvoriti kanal.