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?
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.
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.
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!