Sobes.tech
Junior — Middle

Jak zaimplementować bezpieczne odczytywanie danych z kanału w wielu goroutines jednocześnie?

sobes.tech AI

Odpowiedź od AI

W Go, aby bezpiecznie czytać z kanału z wielu gorutyn jednocześnie, zwykle stosuje się jedno z następujących podejść:

  1. Jeden nadawca, wielu odbiorców — kanał jest tworzony, a kilka gorutyn czyta z niego. Kanał w Go jest bezpieczny do jednoczesnego odczytu z wielu gorutyn, więc można po prostu uruchomić kilka gorutyn, które czytają z tego samego kanału.

  2. Użycie sync.WaitGroup do synchronizacji — aby oczekiwać na zakończenie wszystkich gorutyn.

Przykład:

package main

import (
    "fmt"
    "sync"
)

func worker(id int, ch <-chan int, wg *sync.WaitGroup) {
    defer wg.Done()
    for val := range ch {
        fmt.Printf("Pracownik %d otrzymał %d\n", id, val)
    }
}

func main() {
    ch := make(chan int)
    var wg sync.WaitGroup

    // Uruchamiamy 3 gorutyny czytające z kanału
    for i := 1; i <= 3; i++ {
        wg.Add(1)
        go worker(i, ch, &wg)
    }

    // Wysyłamy dane do kanału
    for i := 0; i < 10; i++ {
        ch <- i
    }
    close(ch) // Zamykamy kanał, aby gorutyny się zakończyły

    wg.Wait() // Czekamy na zakończenie wszystkich gorutyn
}

W ten sposób, kanał w Go już zapewnia bezpieczny dostęp podczas odczytu z wielu gorutyn, kluczowe jest poprawne zarządzanie ich cyklem życia i zamknięcie kanału.