Sobes.tech
Junior — Middle

Come implementare un'attesa sincrona per il completamento di più task paralleli in un programma Go?

sobes.tech AI

Risposta dell'AI

In Go, per aspettare in modo sincrono il completamento di più task paralleli, si utilizza generalmente sync.WaitGroup. Questo permette di avviare più goroutine e attendere che tutte terminino.

Esempio:

package main

import (
    "fmt"
    "sync"
)

func worker(id int, wg *sync.WaitGroup) {
    defer wg.Done() // Comunica al WaitGroup che il task è completato
    fmt.Printf("Worker %d avviato\n", id)
    // simulazione di lavoro
    // time.Sleep(time.Second)
    fmt.Printf("Worker %d terminato\n", id)
}

func main() {
    var wg sync.WaitGroup
    numWorkers := 3

    wg.Add(numWorkers) // Imposta il numero di task

    for i := 1; i <= numWorkers; i++ {
        go worker(i, &wg)
    }

    wg.Wait() // Attende che tutte le goroutine finiscano
    fmt.Println("Tutti i worker hanno terminato")
}

In questo modo, WaitGroup permette di sincronizzare efficacemente l'esecuzione di task paralleli.