capypad
0 Tage Serie
go / expert
Snippet

Ressourcen-Drosselung mit gewichteten Semaphoren

Gewichtete Semaphoren ermöglichen die Steuerung des Zugriffs auf einen gemeinsamen Ressourcenpool, bei dem verschiedene Aufgaben unterschiedliche Mengen dieser Ressource verbrauchen können. Im Gegensatz zu einer einfachen Kanal-basierten Semaphore, die nur Einheiten zählt, kann die gewichtete Semaphore den Zugriff basierend auf variablen 'Kosten' pro Operation gewähren.

snippet.go
go
1
2
3
4
5
6
7
8
9
10
11
var sem = semaphore.NewWeighted(100)
 
func handleRequest(ctx context.Context, cost int64) error {
if err := sem.Acquire(ctx, cost); err != nil {
return err
}
defer sem.Release(cost)
doHeavyWork()
return nil
}
Erklärung
1
semaphore.NewWeighted(100)
Initialisiert eine Semaphore mit einer Gesamtkapazität von 100 Einheiten.
2
sem.Acquire(ctx, cost)
Blockiert, bis die angeforderte Kapazität verfügbar ist oder der Kontext abgebrochen wird.