Modello del semaforo
Limitare la concorrenza con un semaforo basato su canale
Modello del semaforo è una lezione Go Academy gratuita su CoddyKit. Questa è la lezione 3 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.
Che cos'è un semaforo?
Un semaforo limita il numero di goroutine che eseguono un'operazione contemporaneamente. Impedisce l'esaurimento delle risorse, ad esempio a causa di troppe connessioni DB aperte o richieste HTTP in uscita.
Canale con buffer come semaforo
Un canale con buffer di capacità N funziona come un semaforo contatore. L'acquisizione invia un valore al canale e si blocca quando è pieno; il rilascio riceve un valore dal canale.
sem := make(chan struct{}, 10)
func withSem(f func()) {
sem <- struct{}{} // acquire
defer func() { <-sem }() // release
f()
}Una goroutine per ogni attività con un semaforo
Avvii una goroutine per ogni attività, ma limiti la concorrenza con un semaforo:
sem := make(chan struct{}, 5)
for _, job := range jobs {
sem <- struct{}{}
go func(j Job) {
defer func() { <-sem }()
process(j)
}(job)
}Svuotare il semaforo alla fine
Dopo aver avviato tutte le goroutine, svuoti il semaforo per assicurarti che terminino tutte prima del ritorno:
// After the loop, acquire all N slots (blocks until all goroutines release)
for i := 0; i < cap(sem); i++ {
sem <- struct{}{}
}golang.org/x/sync/semaphore
Per un semaforo pesato, ad esempio per goroutine con pesi diversi in termini di risorse, usi il tipo semaphore.Weighted:
s := semaphore.NewWeighted(100)
// acquire 10 units
if err := s.Acquire(ctx, 10); err != nil { return err }
defer s.Release(10)
// do workAcquisizione sensibile al context
Il metodo Acquire del semaforo pesato rispetta un context e restituisce un errore se il context viene cancellato prima che il semaforo sia disponibile.
TryAcquire
s.TryAcquire(n) acquisisce n unità solo se sono immediatamente disponibili e restituisce false altrimenti. È utile per i controlli non bloccanti.
Semaforo e worker pool a confronto
Un worker pool dispone di un insieme fisso di goroutine persistenti. Un semaforo consente di avviare goroutine su richiesta, limitando però la concorrenza. Usi un semaforo quando il ritmo di arrivo delle attività varia notevolmente.
Limitare la concorrenza HTTP
Avvolga un gestore HTTP o un client in un semaforo per impedire troppe richieste in uscita o goroutine di gestori in ingresso simultanee.
Limitare le connessioni al database
Invece di un semaforo, imposti db.SetMaxOpenConns(n) e db.SetMaxIdleConns(m): il pacchetto sql gestisce internamente la concorrenza del pool di connessioni.
Equità dei semafori
I semafori basati su canali con buffer sono approssimativamente equi, in ordine FIFO per le goroutine bloccate sull'invio, ma l'equità non è garantita rigidamente. Il pacchetto del semaforo pesato fornisce garanzie di equità più rigorose.
Verifica rapida
In che modo un canale con buffer implementa un semaforo?
Riepilogo: pattern del semaforo
Punti chiave:
- Canale con buffer sem := make(chan struct{}, N) per semafori semplici
- Inviare per acquisire, ricevere per rilasciare; utilizzi sempre defer per il rilascio
- golang.org/x/sync/semaphore per la variante pesata e compatibile con context
- Utilizzi errgroup.SetLimit per semplici limiti di concorrenza per gruppo
Domande Frequenti
La lezione «Modello del semaforo» è gratuita?
Sì — il testo completo di «Modello del semaforo» è 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 «Modello del semaforo»?
Limitare la concorrenza con un semaforo basato su canale 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 3 di 4.
Quanto tempo richiede la lezione «Modello del semaforo»?
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
- Modelli pipeline e stage
- errgroup per la gestione concorrente degli errori
- Modello del semaforo
- Rilevamento delle perdite e annullamento