Go Academy · Lezione

errgroup per la gestione concorrente degli errori

golang.org/x/sync/errgroup nella pratica

Lezione 2 di 413 passaggi

errgroup per la gestione concorrente degli errori è una lezione Go Academy gratuita su CoddyKit. Questa è la lezione 2 di 4. Puoi leggere la lezione completa qui gratuitamente — poi esercitati direttamente nel browser con un editor di codice integrato e un tutor IA disponibile 24/7. Fa parte del percorso di apprendimento Go Academy, e i tuoi progressi si sincronizzano tra il web e l'app CoddyKit. Il corso Go Academy include 4 lezioni in totale.

Il problema delle goroutine e degli errori

L'avvio di goroutine con go func() scarta i valori restituiti, inclusi gli errori. Servono meccanismi aggiuntivi, come canali e WaitGroup, per raccoglierli. errgroup semplifica questa operazione.

golang.org/x/sync/errgroup

errgroup.Group esegue goroutine e raccoglie gli errori. Wait() blocca l'esecuzione finché tutte le goroutine non terminano e restituisce il primo errore non nil.

var g errgroup.Group
g.Go(func() error { return fetchUsers() })
g.Go(func() error { return fetchOrders() })
if err := g.Wait(); err != nil {
    log.Fatal(err)
}

errgroup.WithContext

WithContext restituisce un gruppo e un context derivato. Il context viene cancellato quando la prima goroutine restituisce un errore, interrompendo il lavoro rimanente.

g, ctx := errgroup.WithContext(context.Background())
g.Go(func() error { return doWork(ctx) })
g.Go(func() error { return doOtherWork(ctx) })
err := g.Wait()

Raccogliere i risultati insieme agli errori

errgroup non raccoglie i risultati, ma solo gli errori. Catturi i risultati in slice preallocate, accedendovi tramite indice per evitare la sincronizzazione:

results := make([]Result, len(items))
for i, item := range items {
    i, item := i, item
    g.Go(func() error {
        r, err := process(ctx, item)
        if err != nil { return err }
        results[i] = r
        return nil
    })
}
if err := g.Wait(); err != nil { return err }

g.SetLimit (Go 1.20+)

g.SetLimit(n) limita il numero di goroutine in esecuzione contemporaneamente: funziona come un semaforo inline senza un canale separato.

g.SetLimit(10) // at most 10 goroutines at once
for _, item := range items {
    g.Go(func() error { return process(item) })
}

g.TryGo

g.TryGo(f) avvia la goroutine solo se il limite, impostato da SetLimit, lo consente. Restituisce false se la goroutine non viene avviata.

Viene restituito solo il primo errore

errgroup restituisce solo il primo errore. Se sono necessari tutti gli errori, li raccolga in una slice protetta da mutex all'interno di ogni goroutine.

var mu sync.Mutex
var errs []error
g.Go(func() error {
    if err := doWork(); err != nil {
        mu.Lock(); errs = append(errs, err); mu.Unlock()
    }
    return nil
})

Differenza rispetto a sync.WaitGroup

WaitGroup tiene traccia del completamento; errgroup tiene traccia del completamento E raccoglie gli errori. Preferisca errgroup quando è necessario segnalare il fallimento di una qualsiasi goroutine.

Propagazione della cancellazione del context

Quando si usa errgroup.WithContext, la cancellazione del context derivato segnala a tutte le altre goroutine di arrestarsi, secondo una semantica simile alla cancellazione al primo errore.

Testare il codice errgroup

Nei test, inietti un context con WithTimeout per assicurarsi che il gruppo non venga eseguito indefinitamente se una goroutine si blocca.

ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second)
defer cancel()
g, ctx := errgroup.WithContext(ctx)

Alternativa con un semaforo

Prima di SetLimit (Go < 1.20), usi un canale con buffer come semaforo all'interno delle singole goroutine per ottenere lo stesso effetto.

Verifica rapida

Che cosa restituisce errgroup.WithContext che un semplice errgroup.Group non restituisce?

Riepilogo: errgroup

Punti chiave:

  • g.Go(func() error): avvia una goroutine e raccoglie il primo errore
  • g.Wait(): blocca l'esecuzione fino al completamento di tutte le goroutine; restituisce il primo errore
  • WithContext: il context viene cancellato al primo errore
  • g.SetLimit(n): limita il numero di goroutine concorrenti (Go 1.20+)
Gratis per iniziare

Impara Go con un tutor IA — gratis

Scrivi ed esegui vero codice nel tuo browser, ricevi aiuto istantaneo da un tutor IA disponibile 24/7, e riprendi da dove hai lasciato sul web o nell'app.

Corsi
51
Lezioni
203

Domande Frequenti

La lezione «errgroup per la gestione concorrente degli errori» è gratuita?

Sì — il testo completo di «errgroup per la gestione concorrente degli errori» è gratuito qui sul web. Per esercitarvi in modo interattivo (un editor di codice integrato e un tutor IA 24/7) e sbloccare il resto del corso Go Academy, passa a CoddyKit PRO. Il corso Go Academy include 4 lezioni in totale.

Cosa imparerò in «errgroup per la gestione concorrente degli errori»?

golang.org/x/sync/errgroup nella pratica Eserciti Go Academy con codice pratico che esegui direttamente nel browser, e un tutor IA 24/7 risponde alle tue domande mentre lavori sulla lezione.

Ho bisogno di esperienza per iniziare Go Academy?

Non è richiesta alcuna esperienza precedente. Go Academy su CoddyKit è strutturato per principianti e studenti avanzati, quindi puoi iniziare da qui o dall'inizio e procedere al tuo ritmo. Questa è la lezione 2 di 4.

Quanto tempo richiede la lezione «errgroup per la gestione concorrente degli errori»?

La maggior parte delle lezioni CoddyKit richiede circa 5–10 minuti. Ogni lezione è breve e interattiva, quindi fai progressi costanti e riprendi esattamente da dove hai lasciato su web e app.

Posso scrivere ed eseguire codice in questa lezione Go Academy?

Sì. Ogni lezione Go Academy include un editor di codice integrato, quindi scrivi ed esegui codice reale direttamente nel tuo browser e ricevi feedback istantaneo dall'IA — nessuna configurazione locale necessaria.

Tutte le lezioni di questo corso

  1. Modelli pipeline e stage
  2. errgroup per la gestione concorrente degli errori
  3. Modello del semaforo
  4. Rilevamento delle perdite e annullamento
← Torna a Go Academy