Erwerb von Schlössern mit Zeitbeschränkungen in Golang
Bei der Arbeit mit Schlössern in Golang gibt es Situationen, in denen Sie möglicherweise entweder ein Schloss erwerben müssen sofort melden oder eine Frist einhalten. Während der sync.Mutex der Standardbibliothek nur die Funktionen Lock() und Unlock() bereitstellt, gibt es eine Technik, mit der Sie eine Sperre mit einer Frist emulieren können.
Implementieren einer Sperre mit einer Frist
Um eine Sperre mit einer Frist zu erstellen, können Sie einen Kanal mit einer Puffergröße von eins verwenden:
l := make(chan struct{}, 1)
Zum Sperren senden Sie einen Strukturwert an den Kanal:
l <- struct{}{}
Zum Entsperren empfangen Sie vom Kanal:
<-l
Durchführen einer Try-Sperre
Um eine Try-Sperre zu versuchen, verwenden Sie eine Select-Anweisung :
select { case l <- struct{}{}: // lock acquired <-l default: // lock not acquired }
Mit diesem Code wird die Sperre sofort aktiviert, sofern sie verfügbar ist. Wenn die Sperre bereits gehalten wird, wird die SELECT-Anweisung blockiert, bis die Sperre aufgehoben wird.
Versuchssperre mit Zeitüberschreitung
Um eine Zeitüberschreitung für die Versuchssperre anzugeben, fügen Sie hinzu ein time.After()-Kanal zur select-Anweisung:
select { case l <- struct{}{}: // lock acquired <-l case <-time.After(time.Minute): // lock not acquired }
Dieser Code versucht bis zu einer Minute lang, die Sperre zu erlangen. Wenn die Zeitüberschreitung abläuft, wird die Select-Anweisung beendet und die Sperre wird nicht erworben.
Fazit
Verwendung eines Kanals mit einer Puffergröße von eins als Mutex ermöglicht Ihnen die Implementierung einer Try-Sperre mit einer Frist. Diese Technik kann in Szenarien nützlich sein, in denen Sie schnell oder innerhalb eines bestimmten Zeitrahmens eine Sperre erwerben müssen.
Das obige ist der detaillierte Inhalt vonWie implementiert man eine Sperre mit einer Frist in Golang?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!