Heim  >  Artikel  >  Backend-Entwicklung  >  Können Sie in Go eine „gepufferte Sperre“ erstellen?

Können Sie in Go eine „gepufferte Sperre“ erstellen?

Mary-Kate Olsen
Mary-Kate OlsenOriginal
2024-11-17 14:33:02577Durchsuche

Can You Create a

Semaphoren: Ein gepuffertes Sperrmuster in Go

Go führt das Konzept gepufferter Kanäle ein, das es Kanälen ermöglicht, Nachrichten ohne Blockierung anzunehmen, bis der Puffer gefüllt ist. Dies wirft die Frage auf: Kann ein ähnliches Muster auf Sperrmechanismen angewendet werden, um eine „gepufferte Sperre“ zu erstellen, die den Ressourcenzugriff auf eine bestimmte Anzahl von Clients beschränkt?

Die Lösung: Semaphoren

Das Primitiv Entwickelt für die Verwaltung des Zugriffs auf gemeinsam genutzte Ressourcen bei gleichzeitiger Begrenzung der Client-Parallelität, wird als Semaphor bezeichnet. In Go können Semaphore einfach mithilfe gepufferter Kanäle implementiert werden.

Implementierung

Beachten Sie den folgenden Codeausschnitt:

var semaphore = make(chan struct{}, 4) // limit to 4 concurrent users

func f() {
    // Acquire the lock. Blocks until at most 3 other goroutines are already executing f.
    semaphore <- struct{}{}

    // Release the lock when done.
    defer func() { <-semaphore }()

    // Perform the protected work...
}

Hier wird das Semaphor durch einen gepufferten Kanal dargestellt der Größe 4, die bis zu vier gleichzeitige Aufrufe der Funktion f ermöglicht. Die <-Semaphore-Operation ruft einen Wert vom Kanal ab und blockiert ihn, bis einer verfügbar wird. Die <-Semaphore-Operation gibt einen Wert zurück in den Kanal, sodass eine andere Goroutine die Sperre erwerben kann.

Fazit

Semaphoren bieten einen einfachen und effektiven Mechanismus zur Implementierung gepufferter Sperren in Go und ermöglichen so die Aktivierung Kontrollierter Zugriff auf gemeinsam genutzte Ressourcen durch eine begrenzte Anzahl von Clients.

Das obige ist der detaillierte Inhalt vonKönnen Sie in Go eine „gepufferte Sperre“ erstellen?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn