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:
-
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.
-
Použitie
sync.WaitGroupna 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.