Sobes.tech
Junior — Middle

Come implementare una lettura sicura dei dati da un canale in più goroutine contemporaneamente?

sobes.tech AI

Risposta dell'AI

In Go, per leggere in modo sicuro da un canale da più goroutine contemporaneamente, di solito si utilizzano uno dei seguenti approcci:

  1. Un mittente, più ricevitori — si crea un canale e più goroutine leggono da esso. Il canale in Go è sicuro per la lettura simultanea da più goroutine, quindi è sufficiente avviare più goroutine che leggono da un singolo canale.

  2. Utilizzo di sync.WaitGroup per la sincronizzazione — per aspettare che tutte le goroutine terminino.

Esempio:

package main

import (
    "fmt"
    "sync"
)

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

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

    // Avviamo 3 goroutine che leggono dal canale
    for i := 1; i <= 3; i++ {
        wg.Add(1)
        go worker(i, ch, &wg)
    }

    // Inviamo dati nel canale
    for i := 0; i < 10; i++ {
        ch <- i
    }
    close(ch) // Chiudiamo il canale per terminare le goroutine

    wg.Wait() // Aspettiamo che tutte le goroutine finiscano
}

In questo modo, il canale in Go garantisce già un accesso sicuro in lettura da più goroutine, l'importante è gestire correttamente il ciclo di vita e chiudere il canale.