Sobes.tech
Junior — Middle

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

sobes.tech AI

Отговор от 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("Работник %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 вече осигурява безопасен достъп при четене от няколко горутини, важното е правилно да управляваме техния жизнен цикъл и да затваряме канала.