Junior — Middle
Как да реализираме безопасно четене на данни от канал в няколко горутини едновременно?
sobes.tech AI
Отговор от AI
В Go за безопасно четене от канал от няколко горутини едновременно обикновено се използва един от следните подходи:
-
Един изпращач, няколко получатели — създава се канал и няколко горутини четат от него. Каналът в Go е безопасен за едновременна четене от няколко горутини, затова може просто да стартирате няколко горутини, които четат от един и същи канал.
-
Използване на
sync.WaitGroupза синхронизация — за да изчакате всички горутини да завършат.
Пример:
package main
import (
"fmt"
"sync"
)
func worker(id int, ch <-chan int, wg *sync.WaitGroup) {
defer wg.Done()
for val := range ch {
fmt.Printf("Работник %d получи %d\n", id, val)
}
}
func main() {
ch := make(chan int)
var wg sync.WaitGroup
// Стартираме 3 горутини, които четат от канала
for i := 1; i <= 3; i++ {
wg.Add(1)
go worker(i, ch, &wg)
}
// Изпращаме данни към канала
for i := 0; i < 10; i++ {
ch <- i
}
close(ch) // Затваряме канала, за да приключат горутините
wg.Wait() // Изчакваме всички горутини да приключат
}
По този начин, каналът в Go вече осигурява безопасен достъп при четене от няколко горутини, важното е правилно да управляваме техния жизнен цикъл и да затваряме канала.