Sobes.tech
Back to questions
Junior — Middle
81

Каким образом реализовать безопасное чтение данных из канала в нескольких горутинах одновременно?

Answer from AI

sobes.tech AI

В Go для безопасного чтения из канала несколькими горутинами одновременно обычно используют один из следующих подходов:

  1. Один отправитель, несколько получателей — канал создаётся, и несколько горутин читают из него. Канал в Go безопасен для одновременного чтения из нескольких горутин, поэтому можно просто запускать несколько горутин, которые читают из одного канала.

  2. Использование 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 уже обеспечивает безопасный доступ при чтении из нескольких горутин, главное — правильно управлять их жизненным циклом и закрывать канал.