Назад к вопросам
Junior — Middle
80
Каким образом реализовать безопасное чтение данных из канала в нескольких горутинах одновременно?
Ответ от нейросети
sobes.tech 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("Worker %d received %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 уже обеспечивает безопасный доступ при чтении из нескольких горутин, главное — правильно управлять их жизненным циклом и закрывать канал.