Go Academy · Lektion

Semaformönstret

Begränsa samtidighet med en kanalsemafor

Lektion 3 av 413 steg

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 work

Context-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
Gratis att börja

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

  1. Pipeline- och stegmönster
  2. errgroup för samtidig felhantering
  3. Semaformönstret
  4. Läckdetektering och avbrytning
← Tillbaka till Go Academy