Heim > Artikel > Backend-Entwicklung > Können Semaphore gepuffertes Locking in Go emulieren?
Gepufferte Sperrmuster
In Go ermöglicht das Konzept eines gepufferten Kanals nicht blockierende Vorgänge, bis der Puffer des Kanals gefüllt ist. Inspiriert durch diesen Mechanismus entsteht die Frage: Gibt es ein allgemeines Muster ähnlich gepufferten Kanälen für „gepufferte Sperrung“, bei dem eine Ressource für eine endliche Menge von Clients gesperrt werden kann?
Antwort: Semaphoren
Das Primitiv, das diese Anforderung erfüllt, ist ein Semaphor. Da ein Semaphor mit einem gepufferten Kanal konstruiert ist, begrenzt es die Anzahl der gleichzeitigen Clients, die auf eine Ressource zugreifen können.
Betrachten Sie die folgende Implementierung mit einem gepufferten Kanal:
var semaphore = make(chan struct{}, 4) // allow four concurrent users func f() { // Grab the lock. Blocks as long as 4 other invocations of f are still running. semaphore <- struct{}{} // Release the lock once we're done. defer func() { <-semaphore }() // Do work... }
In diesem Szenario , erhält die f-Funktion die Sperre, indem sie einen Wert in den Semaphorkanal sendet. Wenn der Kanal voll ist, was der maximal zulässigen Parallelität entspricht, blockiert f, bis ein anderer Client die Sperre aufhebt, indem er einen Wert vom Kanal empfängt. Die Defer-Anweisung stellt sicher, dass die Sperre aufgehoben wird, wenn die Funktion zurückkehrt.
Das obige ist der detaillierte Inhalt vonKönnen Semaphore gepuffertes Locking in Go emulieren?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!