Heim > Artikel > Backend-Entwicklung > Wie kann man in Go eine zeitgebundene Sperre implementieren?
Versuch, eine zeitgebundene Sperre in Go zu erwerben
In Go stellt der integrierte sync.Mutex nur Lock() bereit und Unlock()-Methoden. Es gibt jedoch Situationen, in denen es von Vorteil wäre, den Versuch zu haben, eine Sperre mit einer Frist zu erhalten, indem man entweder sofort abbricht oder eine Frist einhält.
Problembeschreibung
Berücksichtigen Sie die folgenden Szenarien:
Lösung: Kanalbasierter Mutex
Eine einfache Lösung, um den Erwerb einer Sperre mit einer Frist zu erreichen, ist um einen Kanal mit einer Puffergröße von eins als Mutex zu verwenden.
Implementierung
<code class="go">l := make(chan struct{}, 1) // Lock: send a struct to the channel l <- struct{}{} // Unlock: receive a struct from the channel <-l</code>
Try Lock
Um zu versuchen, die Sperre zu erhalten, verwenden Sie den folgenden Code:
<code class="go">select { case l <- struct{}{}: // Lock acquired defer <-l default: // Lock not acquired }</code>
Versuchen Sie es mit Timeout
Um zu versuchen, die Sperre mit einem Timeout zu erhalten, verwenden Sie:
<code class="go">select { case l <- struct{}{}: // Lock acquired defer <-l case <-time.After(time.Minute): // Lock not acquired }</code>
Fazit
Durch die Verwendung eines kanalbasierten Ansatzes ist es möglich, eine Sperre zu implementieren, die versuchte Erfassungen mit Timeouts in Go unterstützt und so eine größere Flexibilität bei der Handhabung von Sperrszenarien bietet Zeitbeschränkungen.
Das obige ist der detaillierte Inhalt vonWie kann man in Go eine zeitgebundene Sperre implementieren?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!