Semaformönstret
Begränsa samtidighet med en kanalsemafor
Semaformönstret är en gratis lektion i Go Academy på CoddyKit. Detta är lektion 3 av 4. Du kan läsa vilka 3 lektioner som helst i den här lärvägen kostnadsfritt i sin helhet – därefter låser CoddyKit PRO upp alla lektioner, plus praktisk övning med en inbyggd kodredigerare och en AI-lärare dygnet runt. Den ingår i lärvägen för Go Academy, och Era framsteg synkroniseras mellan webben och CoddyKit-appen. Kursen i Go Academy innehåller totalt 4 lektioner.
Vad är en semafor?
En semafor begränsar antalet goroutines som utför en åtgärd samtidigt. Den förhindrar att resurser tar slut (till exempel på grund av för många öppna DB-anslutningar eller utgående HTTP-förfrågningar).
Buffrad kanal som semafor
En buffrad kanal med kapaciteten N fungerar som en räknande semafor. Förvärv skickar till kanalen (blockerar när den är full), och frigörande tar emot från den.
sem := make(chan struct{}, 10)
func withSem(f func()) {
sem <- struct{}{} // acquire
defer func() { <-sem }() // release
f()
}En goroutine per jobb med semafor
Starta en goroutine per jobb, men begränsa samtidigheten med en semafor:
sem := make(chan struct{}, 5)
for _, job := range jobs {
sem <- struct{}{}
go func(j Job) {
defer func() { <-sem }()
process(j)
}(job)
}Töm semaforen i slutet
När alla goroutines har startats ska du tömma semaforen för att säkerställa att alla slutförs innan funktionen returnerar:
// 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
För en viktad semafor (till exempel för goroutines med olika resursvikter) ska du använda typen semaphore.Weighted:
s := semaphore.NewWeighted(100)
// acquire 10 units
if err := s.Acquire(ctx, 10); err != nil { return err }
defer s.Release(10)
// do workContext-medvetet förvärv
Den viktade semaforens Acquire respekterar en context och returnerar ett fel om contexten avbryts innan semaforen blir tillgänglig.
TryAcquire
s.TryAcquire(n) förvärvar n enheter endast om de är tillgängliga direkt och returnerar annars false. Användbart för icke-blockerande kontroller.
Semafor jämfört med worker pool
En worker pool har en fast uppsättning beständiga goroutines. Med en semafor kan du starta goroutines vid behov, men ändå begränsa samtidigheten. Använd en semafor när ankomsttakten för jobb varierar kraftigt.
Begränsning av HTTP-samtidighet
Omslut en HTTP-handler eller klient med en semafor för att förhindra för många samtidiga utgående förfrågningar eller inkommande handler-goroutines.
Begränsning av databasanslutningar
I stället för en semafor kan du ange db.SetMaxOpenConns(n) och db.SetMaxIdleConns(m) – sql-paketet hanterar samtidigheten i anslutningspoolen internt.
Semaforens rättvisa
Semaforer med buffrade kanaler är ungefär rättvisa (FIFO för goroutines som blockeras vid sändning), men det är inte strikt garanterat. Paketet med viktade semaforer ger striktare garantier för rättvisa.
Snabbkontroll
Hur implementerar en buffrad kanal en semafor?
Sammanfattning: semaformönstret
Viktiga punkter:
- Buffrad kanal sem := make(chan struct{}, N) för enkla semaforer
- Skicka för att förvärva; ta emot för att frigöra; använd alltid defer för frigöringen
- golang.org/x/sync/semaphore för en viktad variant som stöder kontext
- Använd errgroup.SetLimit för enkla samtidighetsbegränsningar per grupp
Lär dig Go med en AI-lärare – gratis
Skriv och kör riktig kod i webbläsaren, få omedelbar hjälp av en AI-lärare dygnet runt och fortsätt där du slutade – på webben eller i appen.
- Kurser
- 51
- Lektioner
- 203
Vanliga frågor
Är lektionen ”Semaformönstret” gratis?
Ja – du kan läsa vilka 3 lektioner som helst i lärvägen Go Academy, inklusive ”Semaformönstret”, kostnadsfritt i sin helhet här på webben. Därefter låser CoddyKit PRO upp alla lektioner, plus interaktiv övning med en inbyggd kodredigerare och en AI-lärare dygnet runt. Kursen i Go Academy innehåller totalt 4 lektioner.
Vad lär jag mig i ”Semaformönstret”?
Begränsa samtidighet med en kanalsemafor Ni övar på Go Academy med praktisk kod som körs direkt i webbläsaren, medan en AI-handledare som är tillgänglig dygnet runt svarar på Era frågor under lektionen.
Behöver jag någon erfarenhet för att börja lära mig Go Academy?
Du behöver inga förkunskaper. Utbildningen i Go Academy på CoddyKit är upplagd för allt från nybörjare till avancerade elever, så att du kan börja här eller från början och gå fram i din egen takt. Detta är lektion 3 av 4.
Hur lång tid tar lektionen ”Semaformönstret”?
De flesta CoddyKit-lektioner tar cirka 5–10 minuter. Varje lektion är kort och interaktiv, så att du gör stadiga framsteg och kan fortsätta precis där du slutade – på webben eller i appen.
Kan jag skriva och köra kod i den här Go Academy-lektionen?
Ja. Varje Go Academy-lektion innehåller en inbyggd kodredigerare, så att du kan skriva och köra riktig kod direkt i webbläsaren och få omedelbar AI-feedback – utan lokal installation.
Alla lektioner i den här kursen
- Pipeline- och stegmönster
- errgroup för samtidig felhantering
- Semaformönstret
- Läckdetektering och avbrytning